例如,我有:
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()
的结果以避免此缩减过程?
修改
我在这里发现了类似的问题,但我不太清楚答案
Save functions for re-using without re-execution
答案 0 :(得分:5)
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()的结果保存到单独的变量中,然后可以将其传递给calculate()。
答案 1 :(得分:5)
写一个简单的装饰者:
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/。
答案 2 :(得分:1)
更新了现代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'
这将存储对32
的最后get_pep
个调用,并且使用相同的参数调用该调用时,将返回缓存的值。