在脚本的速度方面,我如何在Python中命令条件是否重要?在例如SQL中它不是因为“口译员”假设哪个条件排序最快。
在Python中,据我所知,条件的顺序将由解释器给出。举个例子,如果我链条或者条件,最好是按照假定的时间对条件进行排序,因为当第一个条件不适用时,解释器可能会停止查找其他条件吗?
答案 0 :(得分:5)
是的,条件的顺序很重要。除非您使用括号更改它,否则它们将从左到右进行评估。
是的,只有在表达的结果尚未明确的情况下才会评估条件。例如,在
中if 1==0 and foo**10000 > 2:
Python会立即返回False
,甚至不会尝试计算foo**10000
。
答案 1 :(得分:2)
Python不会像在SQL中那样重新排序您的条件,但它会short circuit。这意味着它将尽快停止评估。因此,如果您有if True == True or long_function_call():
,则永远不会评估long_function_call()
。这与and
的{{1}}类似。在编写条件语句时考虑这一点符合您的最佳利益,并且可能导致性能发生变化。
答案 2 :(得分:1)
Python中的布尔运算符是short-circuiting - 只要表达式的结果清晰,评估就会停止。这在Python的后期绑定中起着重要作用。
例如,这是一个常见的检查:
def do(condition_check=None):
if condition_check is not None and condition_check():
# do stuff
Python过早优化通常非常保守。如果有可能破坏某些东西,Python就不会尝试。
如果要检查解释器优化,请尝试dis
模块。它显示了Python核心实际运行的指令。例如,Python将解析常量表达式(10**10
=> 10000000000
)并提前退出and
(JUMP_IF_FALSE_OR_POP
)。
dis.dis('1==0 and 10**10 > 2')
1 0 LOAD_CONST 0 (1)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 JUMP_IF_FALSE_OR_POP 21
12 LOAD_CONST 4 (10000000000)
15 LOAD_CONST 3 (2)
18 COMPARE_OP 4 (>)
>> 21 RETURN_VALUE
请注意,甚至pypy都没有对此代码进行任何进一步的优化!