如何存储已执行函数的结果并在之后重用?
比如,我有:
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()
的结果存起来,以避免这个重复的过程呢?
编辑:
我在这里找到了一个类似的问题,但我不太明白答案是什么。
保存函数以便重复使用而不重新执行
3 个回答
1
现代Python的更新答案
如果你还在寻找怎么做这个,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
函数的调用,当你用相同的参数再次调用它时,就会返回之前保存的值。
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/。
6
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()。