python - 在 Python >= 3.2 中将缓存存储到文件 functools.lru_cache

标签 python python-3.x memoization

我在 Python 3.3 中使用 @functools.lru_cache。我想将缓存保存到一个文件中,以便在程序重新启动时恢复它。我该怎么办?

编辑 1 可能的解决方案:We need to pickle any sort of callable

问题酸洗__closure__:

_pickle.PicklingError: Can't pickle <class 'cell'>: attribute lookup builtins.cell failed

如果我尝试在没有它的情况下恢复功能,我会得到:

TypeError: arg 5 (closure) must be tuple

最佳答案

你不能使用 lru_cache 做你想做的事,因为它不提供访问缓存的 API,而且它可能在未来的版本中用 C 重写。如果你真的想保存缓存,你必须使用不同的解决方案来访问缓存。

自己写一个缓存很简单。例如:

from functools import wraps

def cached(func):
    func.cache = {}
    @wraps(func)
    def wrapper(*args):
        try:
            return func.cache[args]
        except KeyError:
            func.cache[args] = result = func(*args)
            return result   
    return wrapper

然后您可以将其用作装饰器:

>>> @cached
... def fibonacci(n):
...     if n < 2:
...             return n
...     return fibonacci(n-1) + fibonacci(n-2)
... 
>>> fibonacci(100)
354224848179261915075L

并检索缓存:

>>> fibonacci.cache
{(32,): 2178309, (23,): 28657, ... }

然后您可以随意腌制/取消腌制缓存并加载它:

fibonacci.cache = pickle.load(cache_file_object)

我找到了 feature request在 python 的问题跟踪器中添加转储/加载到 lru_cache,但它没有被接受/实现。也许在未来可以通过 lru_cache 为这些操作提供内置支持。

关于python - 在 Python >= 3.2 中将缓存存储到文件 functools.lru_cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585493/

相关文章:

Python BigQuery API : how to get data asynchronously?

python - 打印不带括号的 numpy 数组

python - render_to_response 时 Django View ValueError

python - 在 Python 上将数据写入 CSV 会将所有数据写入第一列

python - 总结数组内所有不同形状的 numpy 子数组的所有值

haskell - 记住满足约束的结果

algorithm - 内存指数算法

haskell - 在 Haskell 中内存 IO 计算

python - 使用长整数将两个多项式 mod n,x^r-1 相乘 : what is the correct window size?

python - Python 3 导入错误