在我的机器上使用 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
如果将其拆分,看起来会产生高达 10 纳秒的开销。如果 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 来分析几乎任何您想要的内容。