根據呼叫的函式名和呼叫的引數,對函式的結果進行快取,下次執行的時候就不用重複計算
可以用裝飾器來實現
import這裡memoize就是乙個裝飾器,duration是快取過期時間。compute_key函式合併呼叫的函式的名稱、引數並計算出key。time
import
hashlib
import
pickle
cache ={}
defis_obsolete(entry,duration):
d = time.time()-entry['
time']
return d>duration
defcompute_key(function,args,kwargs):
key =pickle.dumps((function.func_name,args,kwargs))
return
hashlib.sha1(key).hexdigest()
def memoize(duration=10):
def_memorize(function):
def__memorize(*args,**kwargs):
key =compute_key(function,args,kwargs)
if key in cache and
notis_obsolete(cache[key],duration):
'we got a winner
'return cache[key][ '
value']
result = function(*args,**kwargs)
cache[key] =
return
result
return
__memorize
return _memorize
函式執行的結果result快取在cache[key]中
@memoize()執行結果:defcomplex(a,b):
time.sleep(2)
return a+b
可以看到函式成功快取,如果把@memoize()改成@memoize(2),快取時間就改成2秒了
例程來自《python高階程式設計》
python用類實現裝飾器
利用 call 方法,裝飾器的執行流程 當新增裝飾器語法糖時,會把語法糖的變數名加 執行,並將被裝飾的函式名傳入。所以當類加 執行時,執行了 init 產生的物件就是被裝飾的函式,而物件 執行時觸發 call call方法下就能新增一些新的功能了 import time class timeit d...
Python 用裝飾器實現遞迴剪枝
求乙個共有10個台階的樓梯,從下走到上面,一次只能邁出1 3個台階,並且不能後退,有多少中方法?每次邁出都是 1 3 個台階,剩下就是 7 9 個台階 如果邁出1個台階,需要求出後面9個台階的走法 如果邁出2個台階,需要求出後面8個台階的走法 如果邁出3個台階,需要求出後面7個台階的走法 此3種方式...
python 裝飾器做快取
裝飾器在之前的文章中有講過,這裡主要是說了裝飾器的用法和應該怎麼理解。這片文章給出一片補充 主要說在快取方面的應用。在此之前呢,需要補充一些知識點 就是 python 查詢變數的順序是什麼?答案就是legb原則 也就是 local enclosed global built in 也就是先在區域性作...