python - 为什么删除 else 会减慢我的代码速度?

标签 python performance recursion

考虑以下函数:

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/

相关文章:

performance - 您应该在哪里启用 SSL?

java - 使用我的快速排序算法对 7 个数字的列表进行排序时出现 StackOverflowError

sql - 如何在 MSSQL 2005 中创建递归查询?

python - 将 vpn 与 python 请求一起使用

performance - 代码生成时间

javascript - ES6类继承的表现

javascript - 如果 JSON 具有某些属性,则删除它的父对象

python - sys.stdin 读什么?

python - pandas中是否有与.groupby相反的 "ungroup by"操作?

python - 更改 Tk 窗口上的标题栏