python - 为什么一种内存策略比另一种慢?

标签 python fibonacci memoization python-decorators

所以这个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

异常在两种情况下非常有效:

  1. 尝试...终于
  2. try ... except,前提是没有抛出异常

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

关于python - 为什么一种内存策略比另一种慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485700/

相关文章:

python - 比较 7 个制表符分隔的文件,打印相似之处

algorithm - 动态规划 - 切杆自下而上算法 (CLRS) 解不正确?

algorithm - 如何使用内存计算递归的时间复杂度?

Python 格式化 SQL WHERE 子句

Python 性能 - 最佳并行方法

python - 抓取并比较网页数据

assembly - assembly x86 中的斐波那契数列

python - 在 Python 中生成偶数列表

javascript - 斐波那契数列 1 kk 迭代

python - 为什么Python斐波那契序列循环比递归慢?