我在 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/