Fra*_*lli 20 python memoization python-3.x
我@functools.lru_cache在Python 3.3中使用.我想将缓存保存到文件中,以便在重新启动程序时恢复它.我该怎么办?
编辑1可能的解决方案:我们需要挑选任何类型的可调用
问题酸洗__closure__:
_pickle.PicklingError: Can't pickle <class 'cell'>: attribute lookup builtins.cell failed
Run Code Online (Sandbox Code Playgroud)
如果我尝试在没有它的情况下恢复功能,我会得到:
TypeError: arg 5 (closure) must be tuple
Run Code Online (Sandbox Code Playgroud)
Bak*_*riu 19
您无法使用所需的内容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
Run Code Online (Sandbox Code Playgroud)
然后,您可以将其应用为装饰器:
>>> @cached
... def fibonacci(n):
... if n < 2:
... return n
... return fibonacci(n-1) + fibonacci(n-2)
...
>>> fibonacci(100)
354224848179261915075L
Run Code Online (Sandbox Code Playgroud)
并检索cache:
>>> fibonacci.cache
{(32,): 2178309, (23,): 28657, ... }
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要选择/取消激活缓存并加载:
fibonacci.cache = pickle.load(cache_file_object)
Run Code Online (Sandbox Code Playgroud)
我在python的问题跟踪器中发现了一个功能请求来添加转储/加载lru_cache,但是它没有被接受/实现.也许将来有可能通过这些操作获得内置支持lru_cache.
你可以使用我的图书馆,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5398 次 |
| 最近记录: |