gpt4 book ai didi

条件评估的Python性能

转载 作者:行者123 更新时间:2023-11-28 19:34:20 25 4
gpt4 key购买 nike

我试图找出在评估条件语句(python 2.6.6)时否定 bool 值是否有任何惩罚。我首先尝试了这个简单的测试(没有 else 分支)

>>> import timeit
>>> timeit.timeit("if not True: pass", number=100000)
0.011913061141967773
>>> timeit.timeit("if True: pass", number=100000)
0.018882036209106445

所以我认为结果是有偏差的,因为 pass 语句可能会被翻译成至少是 一些 操作的 noop。

我做了第二次尝试并得到了这些结果:

>>> timeit.timeit("a=False\nif not a: pass\nelse: pass", number=100000)
0.02387714385986328
>>> timeit.timeit("a=False\nif a: pass\nelse: pass", number=100000)
0.015386819839477539
>>> timeit.timeit("a=True\nif a: pass\nelse: pass", number=100000)
0.02389812469482422
>>> timeit.timeit("a=True\nif not a: pass\nelse: pass", number=100000)
0.015424966812133789

我没想到会看到任何大的惩罚,但从这个结果来看,评估 else 分支似乎比隐式 then 分支更便宜。而且差别很大!

所以第三次尝试返回这些结果:

>>> timeit.timeit("if True: a=1\nelse: a=1", number=100000)
0.022008895874023438
>>> timeit.timeit("if not True: a=1\nelse: a=1", number=100000)
0.022121906280517578

最后我得到了预期的结果。尽管出于好奇,我最后一次尝试了:

>>> timeit.timeit("if False: a=1\nelse: a=1", number=100000)
0.02385997772216797
>>> timeit.timeit("if not False: a=1\nelse: a=1", number=100000)
0.02244400978088379

就是这样...我不知道为什么导致 then 分支的否定条件更快。

可能会发生什么?

所有这些结果都可以在我的计算机上重现,无论我运行多少次,我得到的结果几乎都是一样的。

我认为第一个测试是有偏差的,因为编译器可能已经完全删除了 else: pass 部分。这可能吗?

可能所有这些结果都与 CPU 中的分支预测器有关吗?

还有其他可能的罪魁祸首吗?

最佳答案

首先,“现实世界”新闻:如果您确实处于编写“如果不”或“如果..通过其他...”会影响应用程序性能的情况,我建议您这样做一些严肃的分析,并在 native 代码中重写您的内部循环 - 使用 Cython 或 C(甚至其他选项,例如 Fortran - Python 擅长集成)。

否则,我会说这些是不相关的实现细节。使用“dis”反汇编代码序列可以显示正在发生的事情——但这个级别的优化在 Python 中没有任何实际值(value)——单个函数调用,即使是使用运算符隐含的函数调用,也需要大约一个额外的数量级与 if 语句的执行时间相比。

这里:

>>> dis.dis(compile("if not True: pass", "None", "exec",))
1 0 LOAD_NAME 0 (True)
3 POP_JUMP_IF_TRUE 9
6 JUMP_FORWARD 0 (to 9)
>> 9 LOAD_CONST 0 (None)
12 RETURN_VALUE
>>> dis.dis(compile("if True: pass", "None", "exec",))
1 0 LOAD_NAME 0 (True)
3 POP_JUMP_IF_FALSE 9
6 JUMP_FORWARD 0 (to 9)
>> 9 LOAD_CONST 0 (None)
12 RETURN_VALUE
>>>

如您所见,为使用“不”或不使用 - 但对于跳跃运算符的操作,在两种情况下应该花费相同的时间。

关于条件评估的Python性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com