[英]How to store the result of an executed function and re-use later?
例如,我有:
def readDb():
# Fetch a lot of data from db, spends a lot time
...
return aList
def calculation():
x = readdb()
# Process x
...
return y
在python解釋器中,
每次運行calculation()
,都需要花費大量時間來重新讀取數據庫,這是不必要的。
我如何存儲來自readdb()
的結果以避免這種簡化過程?
編輯:
我在這里找到了類似的問題,但我不太清楚答案
保存功能以供重復使用而無需重新執行
def readDb():
... #Fetch a lot of data from db, spends a lot time
return aList
def calculation(data):
x=data
...process x...
return y
data = readDb()
calculation(data)
calculation(data)
calculation(data)
這只會打一次數據庫。
基本上,您希望將readDb()的結果保存到一個單獨的變量中,然后可以將其傳遞給Calculation()。
寫一個簡單的裝飾器:
class memo(object):
def __init__(self, fun):
self.fun = fun
self.res = None
def __call__(self):
if self.res is None:
self.res = self.fun()
return self.res
@memo
def readDb():
# ... etc
return aList
有關更一般的解決方案,請參見此處: http : //code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/ 。
更新了現代Python的答案
對於仍在尋找操作方法的任何人,標准庫functools
包含一個裝飾器函數@functools.lru_cache
來執行此操作。
例如(來自文檔):
@lru_cache(maxsize=32)
def get_pep(num):
'Retrieve text of a Python Enhancement Proposal'
resource = 'http://www.python.org/dev/peps/pep-%04d/' % num
try:
with urllib.request.urlopen(resource) as s:
return s.read()
except urllib.error.HTTPError:
return 'Not Found'
這將存儲對get_pep
的最后32
調用,並且使用相同的參數調用它時,將返回緩存的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.