Est-ce une "bonne pratique" de créer une classe comme celle ci-dessous qui peut gérer le processus de mémo pour vous? Les avantages de la mémo sont si grands (dans certains cas, comme celui-ci, où il passe de 501003 à 1507 appels de fonction et de 1.409 à 0.006 secondes de temps CPU sur mon ordinateur) qu'il semble que ce serait utile.Gestionnaire de mémo
Cependant, je n'ai lu que des commentaires négatifs sur l'utilisation de eval()
. Cet usage est-il excusable, étant donné la flexibilité qu'offre cette approche?
Ceci peut sauver n'importe quelle valeur retournée automatiquement au prix de perdre des effets secondaires. Merci.
import cProfile
class Memoizer(object):
"""A handler for saving function results."""
def __init__(self):
self.memos = dict()
def memo(self, string):
if string in self.memos:
return self.memos[string]
else:
self.memos[string] = eval(string)
self.memo(string)
def factorial(n):
assert type(n) == int
if n == 1:
return 1
else:
return n * factorial(n-1)
# find the factorial of num
num = 500
# this many times
times = 1000
def factorialTwice():
factorial(num)
for x in xrange(0, times):
factorial(num)
return factorial(num)
def memoizedFactorial():
handler = Memoizer()
for x in xrange(0, times):
handler.memo("factorial(%d)" % num)
return handler.memo("factorial(%d)" % num)
cProfile.run('factorialTwice()')
cProfile.run('memoizedFactorial()')
Vous parlez de "décorateurs Python" et memoization est une utilisation fantastique pour eux. Et cela ne nécessite pas d'Eval (qui sont partiellement mauvais, vous avez bien entendu). – msw