考虑以下函数:
def fact1(n):
if n < 2:
return 1
else:
return n * fact1(n-1)
def fact2(n):
if n < 2:
return 1
return n * fact2(n-1)
它们应该是等价的。但存在性能差异:
>>> T(lambda : fact1(1)).repeat(number=10000000)
[2.5754408836364746, 2.5710129737854004, 2.5678811073303223]
>>> T(lambda : fact2(1)).repeat(number=10000000)
[2.8432059288024902, 2.834425926208496, 2.8364310264587402]
没有 else
的版本会慢 10%。这是相当重要的。为什么?
最佳答案
这里发生的是 fact2
与模块全局变量中的 __name__
存在哈希冲突。这使得全局 fact2
的查找变得稍微慢了一点。
>>> [(k, hash(k) % 32) for k in globals().keys() ]
[('__builtins__', 8), ('__package__', 15), ('fact2', 25), ('__name__', 25), ('fact1', 26), ('__doc__', 29)]
即与 Why is early return slower than else? 相同的答案除了哈希冲突与 __builtins__
关于python - 为什么删除 else 会减慢我的代码速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203696/