在我的机器上使用 IPython
In [1]: foo = True
In [2]: bar = False
In [3]: baz = True
In [4]: %%timeit
...: if foo and not bar and baz:
...: lambda: None
1000000 loops, best of 3: 265 ns per loop
In [5]: %%timeit
...: if foo:
...: if not bar:
...: if baz:
...: lambda: None
1000000 loops, best of 3: 275 ns per loop
如果将其拆分,看起来会有高达 10ns 的开销。如果 10ns 很重要,您可能应该使用另一种语言。
所以对于所有实际目的,不,没有区别。
如果我们再深入一点,我们可以看到这种微小差异的来源。
In [6]: def compound():
...: if foo and not bar and baz:
...: lambda: None
In [7]: def multiple():
....: if foo:
....: if not bar:
....: if baz:
....: lambda: None
In [8]: import dis
In [9]: dis.dis(compound)
2 0 LOAD_GLOBAL 0 (foo)
3 POP_JUMP_IF_FALSE 29
6 LOAD_GLOBAL 1 (bar)
9 UNARY_NOT
10 POP_JUMP_IF_FALSE 29
13 LOAD_GLOBAL 2 (baz)
16 POP_JUMP_IF_FALSE 29
3 19 LOAD_CONST 1 (<code object <lambda> at 0x101d953b0, file "<ipython-input-9-d057c552d038>", line 3>)
22 MAKE_FUNCTION 0
25 POP_TOP
26 JUMP_FORWARD 0 (to 29)
>> 29 LOAD_CONST 0 (None)
32 RETURN_VALUE
这有 13 条指令
In [15]: dis.dis(g)
2 0 LOAD_GLOBAL 0 (foo)
3 POP_JUMP_IF_FALSE 34
3 6 LOAD_GLOBAL 1 (bar)
9 POP_JUMP_IF_TRUE 34
4 12 LOAD_GLOBAL 2 (baz)
15 POP_JUMP_IF_FALSE 31
5 18 LOAD_CONST 1 (<code object <lambda> at 0x101dbb530, file "<ipython-input-10-32b41e5f6f2b>", line 5>)
21 MAKE_FUNCTION 0
24 POP_TOP
25 JUMP_ABSOLUTE 31
28 JUMP_ABSOLUTE 34
>> 31 JUMP_FORWARD 0 (to 34)
>> 34 LOAD_CONST 0 (None)
37 RETURN_VALUE
这有 14 条指令。
我使用系统上的默认 IPython(目前为 2.7.5)执行此操作,但您可以使用此技术对您碰巧运行的任何 Python 版本进行分析。