首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >记忆与功能跟踪

记忆与功能跟踪
EN

Stack Overflow用户
提问于 2020-02-03 21:46:36
回答 1查看 60关注 0票数 2

我试图跟踪一个函数运行了多少次,并使用回忆录来避免不必要地运行该函数。我不知道为什么,但回忆录似乎为大多数价值观储存了两个相同的价值。

代码语言:javascript
复制
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)

结果应该是

代码语言:javascript
复制
10
9
8
7
6
5
4
3
2
1
0
Result: 55
Count: 11

由于某种原因,每件少于9的东西都要加倍。计数实际上是返回19。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-03 23:02:48

您需要将memoize迁移到track

代码语言:javascript
复制
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

代码语言:javascript
复制
from functools import wraps

def track(is_memoized):
  def dec(f):
    def wrapper(arg):
      wrapper.count += 1
      print(arg, end=' ')
      return f(arg)
    wrapper.count = 0
    if is_memoized:
      wrapper = memoize(wrapper)
    return wrapper
  return dec

def memoize(f):
    memo = {}
    @wraps(f)
    def wrapper(arg):
        if arg not in memo:            
            memo[arg] = f(arg)
        return memo[arg]
    return wrapper


@track(is_memoized=True)
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(is_memoized=False)
def fib(n):
    return n if n in (0,1) else fib(n-1) + fib(n-2)

print('Result:', fib(5), '\nCount:', fib.count)
5 4 3 2 1 0 1 2 1 0 3 2 1 0 1 Result: 5 
Count: 15
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60047614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档