所以这个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
异常在两种情况下非常有效:
尝试...终于
try ... except
,前提是没有抛出异常
但是,当异常发生并捕获时,所需的堆栈跟踪 增加了很大的开销。
关于python - 为什么一种内存策略比另一种慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485700/