2024-04-26 05:10:10 发布
网友
注意:这个问题确实在许多其他语言中得到了解答。 但是,我找不到Python的答案,所以不要标记为重复。在
在Python中if-else语句和三元运算符在性能上有区别吗?在
下面是我在ipython7.2.0中的测试(它有%timeit),这是一个内置的计时方法,可以非常容易地测量执行情况。默认情况下,它运行7次,每次运行1亿次,因此结果通常应该是有效的)由PyCharm 2018.3.4社区版x64使用,运行CPython 3.7.2x64。操作系统为Windows 10.0.17134 Enterprise x64:
%timeit
##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
与大多数绩效问题一样,答案是衡量。在
下面是我在ipython7.2.0中的测试(它有
%timeit
),这是一个内置的计时方法,可以非常容易地测量执行情况。默认情况下,它运行7次,每次运行1亿次,因此结果通常应该是有效的)由PyCharm 2018.3.4社区版x64使用,运行CPython 3.7.2x64。操作系统为Windows 10.0.17134 Enterprise x64:我认为数字说明了这些说法。真的很遗憾,因为我喜欢三元的作品
然而,三元运算仍然是绝对有用的,尤其是在函数调用参数中覆盖所有可能的情况下,会产生大量的代码重复,这是我绝对讨厌的。在
我怀疑有没有表现上的差异。它们编译成等价的字节码序列:
与大多数绩效问题一样,答案是衡量。在
相关问题 更多 >
编程相关推荐