Tim*_*man 14 python performance conditional
在if语句中使用和使用多个if语句之间是否存在效率差异?换句话说,是类似的东西
if expr1 == expr2 and expr3==expr4:
dostuff()
Run Code Online (Sandbox Code Playgroud)
从效率的角度来看,那么:
if expr1 == expr2:
if expr3 == expr4:
dostuff()
Run Code Online (Sandbox Code Playgroud)
我的基本测试并没有发现差异,但有更多知识(或至少更彻底的测试)的人是否有明确的答案?
fro*_*die 14
如果影响您的决定,这还不足以产生性能差异.IMO,这里的决定应该纯粹从可读性的角度出发.我认为第一个通常更标准,但有些情况下第二个可能更清晰.选择最能实现您意图的方法.
Joh*_*hin 11
使用and和嵌套ifs 之间的速度差异将是最小的.你正在咆哮错误的树.考虑这棵树:
if oftenTrueCondition and rarelyTrueCondition:
Run Code Online (Sandbox Code Playgroud)
和....相比
if rarelyTrueCondition and oftenTrueCondition:
Run Code Online (Sandbox Code Playgroud)
因此,除非必须首先评估第一个条件(防止下一个表达式崩溃或做一些愚蠢/昂贵的事情),否则请考虑交换评估顺序.
如有疑问,可以使用dis模块检查python在其中编译语句的内容:
>>> import dis
>>> def test1():
... if expr1 == expr2 and expr3==expr4:
... dostuff()
...
>>> def test2():
... if expr1 == expr2:
... if expr3 == expr4:
... dostuff()
...
>>> dis.dis(test1)
2 0 LOAD_GLOBAL 0 (expr1)
3 LOAD_GLOBAL 1 (expr2)
6 COMPARE_OP 2 (==)
9 JUMP_IF_FALSE 24 (to 36)
12 POP_TOP
13 LOAD_GLOBAL 2 (expr3)
16 LOAD_GLOBAL 3 (expr4)
19 COMPARE_OP 2 (==)
22 JUMP_IF_FALSE 11 (to 36)
25 POP_TOP
3 26 LOAD_GLOBAL 4 (dostuff)
29 CALL_FUNCTION 0
32 POP_TOP
33 JUMP_FORWARD 1 (to 37)
>> 36 POP_TOP
>> 37 LOAD_CONST 0 (None)
40 RETURN_VALUE
>>> dis.dis(test2)
2 0 LOAD_GLOBAL 0 (expr1)
3 LOAD_GLOBAL 1 (expr2)
6 COMPARE_OP 2 (==)
9 JUMP_IF_FALSE 28 (to 40)
12 POP_TOP
3 13 LOAD_GLOBAL 2 (expr3)
16 LOAD_GLOBAL 3 (expr4)
19 COMPARE_OP 2 (==)
22 JUMP_IF_FALSE 11 (to 36)
25 POP_TOP
4 26 LOAD_GLOBAL 4 (dostuff)
29 CALL_FUNCTION 0
32 POP_TOP
33 JUMP_ABSOLUTE 41
>> 36 POP_TOP
37 JUMP_FORWARD 1 (to 41)
>> 40 POP_TOP
>> 41 LOAD_CONST 0 (None)
44 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到,在python字节码级别,两个语句都是相同的-即使在第一条语句中使用单条if的情况下,在第一次比较后,它也会执行JUMP_IF_FALSE。