import time
import hashlib
import pickle
cache =
defis_obsolete
(entry, duration)
:# 判斷快取是否過期,返回true則過期
d = time.time(
)- entry[
'time'
]return d > duration
defcompute_key
(function, args, kwargs)
:# 將傳入的引數序列化
key = pickle.dumps(
(function.__name__, args, kwargs)
)return hashlib.sha1(key)
.hexdigest(
)def
memoize
(duration=10)
:# 裝飾器中快取時間預設為10秒
def_memorize
(function)
:# 第二層傳函式
def__memorize
(*args,
**kwargs)
:# 第三層傳入非固定引數
key = compute_key(function, args, kwargs)
if key in cache and
not is_obsolete(cache[key]
, duration)
:print
('we got a winner'
, end=
' '
)return cache[key]
['value'
]# 如果快取中有,就直接返回快取過的結果
result = function(
*args,
**kwargs)
cache[key]
=print
(cache)
return result
return __memorize
return _memorize
@memoize(
100)
defcomplex
(a,b)
: time.sleep(1)
return a+b
while
true
: a=
int(
input
('請輸入a: '))
b=int(
input
('請輸入b: '))
print
(complex
(a, b)
)
python用裝飾器實現快取函式執行結果
根據呼叫的函式名和呼叫的引數,對函式的結果進行快取,下次執行的時候就不用重複計算 可以用裝飾器來實現 import time import hashlib import pickle cache defis obsolete entry,duration d time.time entry time...
python 函式結果快取一段時間的裝飾器
把函式結果快取一段時間,比如讀取乙個mongodb,mongodb中的內容又在發生變化,如果從部署後,自始至終只去讀一次那就感觸不到變化了,如果每次呼叫乙個函式就去讀取那太頻繁了耽誤響應時間也加大了cpu負擔,也不行。那就把結果快取一段時間。來乙個快取一段時間的裝飾器。class functionr...
使用裝飾器為Python函式做快取
寫了個函式作為裝飾器為fibonacci數列做快取,做了一下效能比較。usr bin python coding utf 8 import datetime now datetime.datetime.now from functools import wraps def cache func ca...