Ответ 1
Вы не можете делать то, что хотите, используя lru_cache
, так как он не предоставляет API для доступа к кешу и может быть переписан на C в будущих выпусках. Если вы действительно хотите сохранить кеш, вам нужно использовать другое решение, которое дает вам доступ к кешу.
Достаточно просто написать кеш. Например:
from functools import wraps
def cached(func):
@wraps(func)
def wrapper(*args):
try:
return func.cache[args]
except KeyError:
func.cache[args] = result = func(*args)
return result
wrapper.cache = {}
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 tracker для добавления дампов/нагрузок на lru_cache
, но он не был принят/реализован, Возможно, в будущем можно будет иметь встроенную поддержку этих операций через lru_cache
.