Sembra che tu sei non chiedendo una Memoizzazione decoratore general-purpose (vale a dire, non ti interessa il caso generale in cui desideri memorizzare nella cache i valori di ritorno per i diversi valori degli argomenti). Cioè, si desidera avere questo:
x = obj.name # expensive
y = obj.name # cheap
mentre decoratore general-purpose Memoizzazione darebbe questo:
x = obj.name() # expensive
y = obj.name() # cheap
Io sostengo che la sintassi del metodo-call è lo stile migliore, perché suggerisce la possibilità di un calcolo costoso mentre la sintassi della proprietà suggerisce una rapida ricerca.
[Aggiornamento: Il decoratore di memoizzazione basato su classi che avevo collegato e citato in precedenza non funziona per i metodi. Ho sostituito con una funzione decoratore] Se siete disposti a utilizzare un Memoizzazione generico decoratore, qui è semplice:. L'uso
def memoize(function):
memo = {}
def wrapper(*args):
if args in memo:
return memo[args]
else:
rv = function(*args)
memo[args] = rv
return rv
return wrapper
Esempio:
@memoize
def fibonacci(n):
if n < 2: return n
return fibonacci(n - 1) + fibonacci(n - 2)
Un'altra Memoizzazione decoratore con un limite sulla dimensione della cache può essere trovato here.
fonte
2009-05-02 16:42:33
Ci può essere un decoratore là fuori che ha una certa capacità del genere, ma si rifugio ho accuratamente specificato ciò che vuoi Che tipo di backend di cache stai usando? E come sarà il valore inserito? Sto assumendo dal tuo codice che quello che stai veramente chiedendo è una proprietà di sola lettura memorizzata nella cache. –
Ci sono decoratori memoizing che eseguono ciò che chiamate "cache"; di solito lavorano su funzioni in quanto tali (sia che vogliano diventare metodi o meno) i cui risultati dipendono dai loro argomenti (non su cose mutevoli come il sé!) e quindi mantengono un appunto separato. –