python – 为什么一个memoization策略比另一个慢?

所以关于memoization的page让我很好奇.我运行自己的基准测试.

1)可变默认字典:

%%timeit
def fibo(n, dic={}) :
    if n not in dic :
        if n in (0,1) :
            dic[n] = 1
        else :
            dic[n] = fibo(n-1)+fibo(n-2)
    return dic[ n ]
fibo(30)

日期:

100000 loops, best of 3: 18.3 µs per loop

2)相同的想法,但遵循“更容易请求宽恕而不是许可”的原则:

In [21]:

%%timeit
def fibo(n, dic={}) :
    try :
        return dic[n]
    except :
        if n in (0,1) :
            dic[n] = 1
        else :
            dic[n] = fibo(n-1)+fibo(n-2)
        return dic[ n ]
fibo(30)

日期:

10000 loops, best of 3: 46.8 µs per loop

我的问题

>为什么2)与1)相比这么慢?

编辑

正如@kevin在评论中建议的那样,我让装饰者完全错了,所以我把它删除了.其余的仍然有效! (我希望)

解决方法:

捕获异常意味着堆栈跟踪可能非常昂贵:

https://docs.python.org/2/faq/design.html#how-fast-are-exceptions

在两种情况下,例外非常有效:

>尝试……终于
>尝试…除外,假设没有抛出任何异常

但是,当发生异常并捕获所需的堆栈跟踪时
增加了很多开销.

上一篇:c – 这是斐波纳契系列生成的更好方法


下一篇:python – 我的Fibonacci序列生成器出了什么问题?