python用裝飾器實現快取函式執行結果

2022-08-09 22:27:24 字數 1252 閱讀 4693

根據呼叫的函式名和呼叫的引數,對函式的結果進行快取,下次執行的時候就不用重複計算

可以用裝飾器來實現

import

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):

print

'we got a winner

'return cache[key][ '

value']

result = function(*args,**kwargs)

cache[key] =

return

result

return

__memorize

return _memorize

這裡memoize就是乙個裝飾器,duration是快取過期時間。compute_key函式合併呼叫的函式的名稱、引數並計算出key。

函式執行的結果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 也就是先在區域性作...