用裝飾器快取某個函式的結果

2021-09-13 11:17:16 字數 1379 閱讀 2780

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...