创建一个像下面这样可以为您处理记忆过程的类是“好习惯”吗?记忆化的好处是如此之大(在某些情况下,比如这个,它从我的计算机上的 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()')
您可以记住,而无需求助于eval
.
一个(非常基本的)记忆器:
def memoized(f):
cache={}
def ret(*args):
if args in cache:
return cache[args]
else:
answer=f(*args)
cache[args]=answer
return answer
return ret
@memoized
def fibonacci(n):
if n==0 or n==1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
print fibonacci(100)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)