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

Python 三元运算符vs if-else语句的性能,python,if-statement,ternary-operator,Python,If Statement,Ternary Operator,注意:这个问题确实在许多其他语言中得到了回答。 但是,我找不到Python的答案,所以不要将其标记为重复 if-else语句和Python中的三元运算符在性能上是否存在差异?我怀疑是否存在性能差异。它们编译成等效的字节码序列: >>> def f(): ... return a if b else c ... >>> dis.dis(f) 2 0 LOAD_GLOBAL 0 (b)

注意:这个问题确实在许多其他语言中得到了回答。 但是,我找不到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。操作系统窗口为$10.0.17134 Enterprise x64:

###前2项没有引用该语句,以查看其对测试的影响。
%timeit 3如果为真,否则为8
每个回路14.7纳秒±0.319纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
%timeit 3如果为False,否则为8
每个回路18.1纳秒±0.211纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
##----------------------------------------------------------------------------
%timeit'如果为真:\n 3\n错误:\n 8'
每个回路8.67纳秒±0.314纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
%timeit'如果为假:\n 3\n错误:\n 8'
每个回路8.4纳秒±0.0598纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
##----------------------------------------------------------------------------
##最后两个是引用这句话。
%timeit'3如果为真,否则为8'
每个回路8.73纳秒±0.256纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
%timeit'3如果为False,否则为8'
每个回路9.37纳秒±0.215纳秒(7次运行的平均值±标准偏差,每个100000000个回路)
我认为这些数字说明了这些说法。真的很遗憾,因为我喜欢三元运算


然而,三元运算仍然绝对有用,特别是在函数调用参数中覆盖所有可能会产生大量代码重复的情况下,我绝对不喜欢这种情况。

只要使用您觉得更可读的代码即可。如果您曾经处于一个热循环中,它可能真的会产生影响,那么请以两种方式编写代码,并在实际代码的上下文中度量性能。可能还有其他更重要的因素,例如您使用的算法。我认为这可能与
timeit
尝试解析三重引号注释有更多关系。我定义了函数,用if-else语句和三元运算符计算该条件,使用
timeit.repeat
,重复100次,三元运算符的平均值(默认1000000次运行)为0.81秒,if-else语句的平均值为0.88秒。