记忆和功能跟踪

问题描述 投票:2回答:1

我正在尝试跟踪一个函数运行了多少次,并使用备忘录来避免不必要地运行该函数。我不知道为什么,但是对于大多数值来说,备忘录似乎存储了两个相同的值。

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的所有内容都给予加倍。计数实际上返回了19。任何帮助将不胜感激。

python tracking memoization
1个回答
1
投票

您需要将memoize移至track

def track(f):
  @memoize
  def wrapper(arg):
    wrapper.count += 1
    print(arg, end=' ')
    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
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

通过向track添加附加参数,您可以控制是否要使用memoize装饰器。在这种情况下,您应该使用functools.wraps

functools.wraps
© www.soinside.com 2019 - 2024. All rights reserved.