¿Es una "buena práctica" crear una clase como la siguiente que pueda manejar el proceso de memorización para usted? Los beneficios de la memorización son tan grandes (en algunos casos, como este, donde pasa de llamadas de función 501003 a 1507 y de 1.409 a 0.006 segundos de tiempo de CPU en mi computadora) que parece que una clase como esta sería útil.Memoization Handler
Sin embargo, he leído solo comentarios negativos sobre el uso de eval()
. ¿Es excusable este uso, dada la flexibilidad que ofrece este enfoque?
Esto puede guardar cualquier valor devuelto automáticamente a costa de perder efectos secundarios. Gracias.
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()')
Estás hablando de "decoradores de Python" y la memorización es un uso fantástico para ellos. Y no requiere evaluaciones (que son parcialmente malas, has oído correctamente). – msw