注意:很多其他语言已经回答了这个问题。 但是,我找不到Python的答案,所以不要标记为重复。
if-else语句和Python中的三元运算符之间的性能是否存在差异?
答案 0 :(得分:3)
我怀疑是否存在性能差异。它们编译为等效的字节码序列:
>>> 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
与大多数表现问题一样,答案是衡量。
答案 1 :(得分:0)
从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
答案 2 :(得分:0)
这是我在IPython 7.2.0(具有%timeit
,这是一种内置计时方法,可以非常轻松地测量执行情况)中进行的测试。默认情况下,它进行7次运行,每个循环执行1亿次,因此结果通常是有效的),供运行CPython 3.7.2 x64的PyCharm 2018.3.4 Community Edition x64使用。操作系统是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)
我认为数字代表了声明。真可惜,因为我爱三元运算。
但是,三元运算仍然绝对有用,尤其是在涵盖函数调用参数中所有可能性的情况下,会产生大量的代码重复,这是我绝对讨厌的。