【发布时间】:2020-02-03 21:46:36
【问题描述】:
我正在尝试跟踪一个函数运行了多少次,并使用 memoization 来避免不必要地运行该函数。我不知道为什么,但似乎 memoization 为大多数值存储了两个相同的值。
def track(f):
def wrapper(arg):
wrapper.count += 1
print(arg)
return f(arg)
wrapper.count = 0
return wrapper
def memoize(f):
memo = {}
def wrapper(arg):
if arg not in memo:
memo[arg] = f(arg)
return memo[arg]
return wrapper
@track
@memoize
def fib(n):
return n if n in (0,1) else fib(n-1) + fib(n-2)
print('Result:', fib(10), '\nCount:', fib.count)
结果应该是这样的
10
9
8
7
6
5
4
3
2
1
0
Result: 55
Count: 11
由于某种原因,它会为小于 9 的所有内容释放双倍。Count 实际上返回 19。非常感谢任何帮助。
【问题讨论】:
-
快速回答是你的装饰器执行了两次,因为你的函数是递归的。否则,我正在寻找答案以帮助解决您的问题。
-
您正在跟踪
memoize函数。memoize调用了 19 次。
标签: python tracking memoization