gpt4 book ai didi

python - 记忆化:用硬币找零

转载 作者:行者123 更新时间:2023-11-28 20:42:54 27 4
gpt4 key购买 nike

我正在使用 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

最佳答案

在您当前的代码中:

def memo(fn):
def helper(*args):
d = {}

您创建了一个新的“缓存”字典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

这使得访问修饰函数的缓存以修复错误等变得更容易。

关于python - 记忆化:用硬币找零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29862046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com