Nie możesz zrobić, co chcesz, używając lru_cache
, ponieważ nie zapewnia ona interfejsu API do dostępu do pamięci podręcznej, a może być przepisany w C w przyszłych wydaniach. Jeśli naprawdę chcesz zapisać pamięć podręczną, musisz użyć innego rozwiązania, które zapewnia dostęp do pamięci podręcznej.
Wystarczy, że sam napiszesz pamięć podręczną. Na przykład:
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
Można wtedy zastosować go jako dekorator:
>>> @cached
... def fibonacci(n):
... if n < 2:
... return n
... return fibonacci(n-1) + fibonacci(n-2)
...
>>> fibonacci(100)
354224848179261915075L
i pobierać cache
:
>>> fibonacci.cache
{(32,): 2178309, (23,): 28657, ... }
Można następnie zalewa/unpickle pamięci podręcznej, jak należy i załaduj go:
fibonacci.cache = pickle.load(cache_file_object)
Znalazłem feature request w trackerze błędów Pythona, aby dodać zrzuty/obciążenia do lru_cache
, ale nie zostało to zaakceptowane/zaimplementowane. Być może w przyszłości będzie można mieć wbudowaną obsługę tych operacji za pośrednictwem lru_cache
.
Zauważ, że myślę, że realizacja cache LRU zostanie zastąpiony przez realizację C w Pythonie 3.4 lub 3.5, każda próba wydobycia zawartość pamięci podręcznej prawdopodobnie nie będzie przyszłościowy. –
@MartijnPieters: dziękuję za informacje. –
Po prostu unikaj 'lru_cache'. Czy dla twojej funkcji ważne jest posiadanie 'lru_cache' lub prostej pamięci podręcznej? W przeciwnym razie możesz ponownie zaimplementować 'lru_cache' i dodać pożądaną funkcjonalność. – Bakuriu