您无法使用 做您想做的事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, ... }
然后,您可以随意腌制/取消腌制缓存并加载:
fibonacci.cache = pickle.load(cache_file_object)
我在 python 的问题跟踪器中发现了一个将转储/加载添加到的功能请求lru_cache
,但它没有被接受/实现。也许将来可以通过lru_cache
.