創建一個類似下面的類,可以爲您處理記憶過程是「良好實踐」嗎? memoization的好處是如此之大(在某些情況下,就像這個,它從501003到1507函數調用以及從我的計算機上的1.409到0.006秒的CPU時間),看起來像這樣的類會很有用。記憶處理程序
但是,我只讀過eval()
的使用負面評論。 鑑於此方法提供的靈活性,它是否可以使用?
這可以自動保存任何返回的值,其代價是失去副作用。謝謝。
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(這是部分邪惡的;你已經聽到了正確的)。 – msw 2010-07-31 07:36:30