三元算子与ifelse算子的性能比较

2024-04-26 05:10:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 答案标记语言if运算符语句性能else
2条回答

下面是我在ipython7.2.0中的测试(它有%timeit),这是一个内置的计时方法,可以非常容易地测量执行情况。默认情况下,它运行7次,每次运行1亿次,因此结果通常应该是有效的)由PyCharm 2018.3.4社区版x64使用,运行CPython 3.7.2x64。操作系统为Windows 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)

我认为数字说明了这些说法。真的很遗憾,因为我喜欢三元的作品

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

我怀疑有没有表现上的差异。它们编译成等价的字节码序列:

>>> 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

与大多数绩效问题一样,答案是衡量。在

相关问题 更多 >