【发布时间】:2011-03-23 13:53:44
【问题描述】:
创建一个像下面这样可以为您处理记忆过程的类是“好习惯”吗?记忆化的好处是如此之大(在某些情况下,像这个,其中它从 501003 到 1507 次函数调用以及从 1.409 到 0.006 秒的 CPU 时间在我的计算机上),这样的类似乎很有用。
但是,我只阅读了关于 eval() 用法的负面 cmets。 考虑到这种方法提供的灵活性,这种用法是否可以原谅?
这可以以丢失副作用为代价自动保存任何返回值。谢谢。
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()')
【问题讨论】:
-
您在谈论“Python 装饰器”,而 memoization 对它们来说是一个绝妙的用途。而且它不需要 evals(部分是邪恶的;你没听错)。
标签: python dynamic-programming memoization