メモ化プロセスを処理できる以下のようなクラスを作成することは「良い習慣」ですか? メモ化の利点は非常に大きいため (この例のように、関数呼び出しが 501003 秒から 1507 秒に減少し、コンピューターの CPU 時間が 1.409 秒から 0.006 秒に減少する場合もあります)、このようなクラスが役立つと思われます。
ただし、の使用に関する否定的なコメントしか読んだことがありません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()')