如何存储已执行函数的结果并在之后重用?

5 投票
3 回答
14463 浏览
提问于 2025-04-17 19:38

比如,我有:

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()。

撰写回答