Non è possibile eseguire ciò che si desidera utilizzando lru_cache
, poiché non fornisce un'API per accedere alla cache e potrebbe essere riscritta in C nelle versioni future. Se vuoi veramente salvare la cache devi usare una soluzione diversa che ti dà accesso alla cache.
È abbastanza semplice scrivere una cache da soli. Per esempio:
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
si può quindi applicare come decoratore:
>>> @cached
... def fibonacci(n):
... if n < 2:
... return n
... return fibonacci(n-1) + fibonacci(n-2)
...
>>> fibonacci(100)
354224848179261915075L
e recuperare il cache
:
>>> fibonacci.cache
{(32,): 2178309, (23,): 28657, ... }
È quindi possibile salamoia/deserializzazione cache come ti pare e caricarlo con:
fibonacci.cache = pickle.load(cache_file_object)
Ho trovato un feature request nel tracker dei problemi di Python per aggiungere dump/carichi a lru_cache
, ma non è stato accettato/implementato. Forse in futuro sarà possibile avere il supporto integrato per queste operazioni tramite lru_cache
.
Nota che penso che l'attuazione della cache LRU sta per essere sostituita da un'implementazione C in Python 3.4 o 3.5, qualsiasi tentativo di estrarre il contenuto della cache è probabilmente non sarà a prova di futuro. –
@MartijnPieters: grazie per l'informazione. –
Evita semplicemente 'lru_cache'. È importante che la tua funzione abbia un 'lru_cache' o che sia sufficiente una semplice cache? Altrimenti puoi reimplementare 'lru_cache' e aggiungere la funzionalità desiderata. – Bakuriu