Il semble que vous êtes de ne pas demander pour un usage général memoization décorateur (c'est à dire, vous n'êtes pas intéressé, dans le cas général où vous souhaitez mettre en cache les valeurs de retour pour différentes valeurs d'argument). Qui est, vous aimeriez avoir ceci:
x = obj.name # expensive
y = obj.name # cheap
bien que d'un usage général memoization décorateur vous donnerait ceci:
x = obj.name() # expensive
y = obj.name() # cheap
Je pense que la méthode-la syntaxe d'appel est mieux de style, car elle suggère la possibilité d'un calcul coûteux alors que la syntaxe de la propriété suggère une recherche rapide.
[Mise à jour: La classe de base de memoization décorateur, j'ai eu liés et cités précédemment ne fonctionne pas pour les méthodes. Je l'ai remplacé par un décorateur fonction.] Si vous êtes prêt à utiliser un memoization décorateur, voici un exemple simple:
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
Exemple d'utilisation:
@memoize
def fibonacci(n):
if n < 2: return n
return fibonacci(n - 1) + fibonacci(n - 2)
Un autre memoization décorateur avec une limite sur la taille du cache peut être trouvé ici.