将缓存存储到 Python >= 3.2 中的文件 functools.lru_cache

新手上路,请多包涵

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

编辑 1 可能的解决方案: 我们需要挑选任何类型的可调用对象

酸洗问题 __closure__

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

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

 TypeError: arg 5 (closure) must be tuple

原文由 Francesco Frassinelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

您不能使用 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

并检索 cache

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

然后你可以随意 pickle/unpickle 缓存并加载它:

 fibonacci.cache = pickle.load(cache_file_object)


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

原文由 Bakuriu 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以使用我的图书馆, mezmorize

 import random
from mezmorize import Cache

cache = Cache(CACHE_TYPE='filesystem', CACHE_DIR='cache')

@cache.memoize()
def add(a, b):
    return a + b + random.randrange(0, 1000)

>>> add(2, 5)
727
>>> add(2, 5)
727

原文由 reubano 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题