三元运算符与 if-else 语句的性能

Performance of ternary operator vs if-else statement

注意:的确,许多其他语言都回答了这个问题。 但是,我找不到 Python 的答案,所以不要标记为重复。

if-else语句和Python中的三元运算符在性能上有区别吗?

我怀疑是否存在性能差异。它们编译成等效的字节码序列:

>>> def f():
...   return a if b else c
...
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (b)
              2 POP_JUMP_IF_FALSE        8
              4 LOAD_GLOBAL              1 (a)
              6 RETURN_VALUE
        >>    8 LOAD_GLOBAL              2 (c)
             10 RETURN_VALUE
>>> def g():
...   if b:
...     return a
...   else:
...     return c
...
>>> dis.dis(g)
  2           0 LOAD_GLOBAL              0 (b)
              2 POP_JUMP_IF_FALSE        8

  3           4 LOAD_GLOBAL              1 (a)
              6 RETURN_VALUE

  5     >>    8 LOAD_GLOBAL              2 (c)
             10 RETURN_VALUE
             12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

与大多数性能问题一样,答案是衡量。

从 Python 3.6.1 的一些测试来看,完整的语句似乎更快。

我的结果:

>>> timeit.timeit("""3 if True else 8""")
0.012174860001323395
>>> timeit.timeit("""3 if False else 8""")
0.019092951000857283
>>> timeit.timeit("""if True:
...     3
... else:
...     8""")
0.009110345999943092
>>> timeit.timeit("""if False:
...     3
... else:
...     8""")
0.00877297099941643

这是我在 IPython 7.2.0 中的测试(它有 %timeit,一种内置的计时方法,可以非常容易地测量执行情况。默认情况下,它运行 7 次,每个 1 亿个循环,因此结果通常应该有效)由 PyCharm 2018.3.4 Community Edition x64、运行 CPython 3.7.2 x64 使用。 OS 是 Window$ 10.0.17134 Enterprise x64:

##The 1st 2 are without quoting the statement to see how it affects the test.
%timeit 3 if True else 8
14.7 ns ± 0.319 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

%timeit 3 if False else 8
18.1 ns ± 0.211 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

##----------------------------------------------------------------------------

%timeit 'if True:\n    3\nelse:\n    8'
8.67 ns ± 0.314 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

%timeit 'if False:\n    3\nelse:\n    8'
8.4 ns ± 0.0598 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

##----------------------------------------------------------------------------

##The last 2 are with quoting the statement.
%timeit '3 if True else 8'
8.73 ns ± 0.256 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

%timeit '3 if False else 8'
9.37 ns ± 0.215 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

我认为数字能说明问题。真的很遗憾,因为我喜欢三元运算。

然而,三元运算仍然非常有用,尤其是在覆盖函数调用参数中的所有可能性会产生大量重复代码的情况下,我非常讨厌这种情况。