我正在使用Python进行经典的使用硬币进行更改问题。这是我的实施。
def memo(fn):
def helper(*args): # here, * indicate the fn take arbitrary number of argumetns
d = {}
if args in d:
return d[args] # args is a tuple, immutable, hashable
else:
res = fn(*args) # here * expand a tuple as arguments
d[args] = res
return res
return helper
@memo
def change(options, n):
if n < 0 or options ==():
return 0
elif n == 0:
return 1
else:
return change(options, n- options[0]) + change(options[1:], n)
事实证明,备忘版本比原版更慢!为什么?我的实施出了什么问题?
这没有记忆:
In [172]: %timeit change((50, 25, 10, 5, 1), 100)
100 loops, best of 3: 7.12 ms per loop
这是备忘录:
In [170]: %timeit change((50, 25, 10, 5, 1), 100)
10 loops, best of 3: 21.2 ms per loop
答案 0 :(得分:7)
在您当前的代码中:
def memo(fn):
def helper(*args):
d = {}
每次调用修饰函数时,您都会创建一个新的&#34;缓存&#34; 字典d
。难怪它变慢了!最小的修复是:
def memo(fn):
d = {}
def helper(*args):
但一般来说可能更整洁。我用:
def memo(func):
def wrapper(*args):
if args not in wrapper.cache:
wrapper.cache[args] = func(*args)
return wrapper.cache[args]
wrapper.cache = {}
return wrapper
这样可以更轻松地访问已修饰的函数cache
以修复错误等。