【发布时间】:2016-10-09 17:11:34
【问题描述】:
关于脚本速度,我如何在 Python 中排序条件是否重要?在 SQL 例如它不像“解释器”假设哪个条件排序最快。
据我所知,在 Python 中,条件的顺序将由解释器给出。举个例子,如果我链接或条件,是否最好按假定的时间对条件进行排序,因为当第一个条件不适用时,解释器甚至会停止寻找其他条件?
【问题讨论】:
标签: python performance conditional-statements
关于脚本速度,我如何在 Python 中排序条件是否重要?在 SQL 例如它不像“解释器”假设哪个条件排序最快。
据我所知,在 Python 中,条件的顺序将由解释器给出。举个例子,如果我链接或条件,是否最好按假定的时间对条件进行排序,因为当第一个条件不适用时,解释器甚至会停止寻找其他条件?
【问题讨论】:
标签: python performance conditional-statements
是的,条件的顺序很重要。它们是从左到右计算的,除非您使用括号进行更改。
是的,只有在表达式的结果尚不明确时才会评估条件。例如,在
if 1==0 and foo**10000 > 2:
Python 将立即返回False,甚至不会尝试计算foo**10000。
【讨论】:
10000**10000 是由编译器计算的。 foo**10000 可能是一个更好的例子。
Python 不会像在 SQL 中那样对条件重新排序,但它会 short circuit。这意味着它将尽快停止评估。所以如果你有if True == True or long_function_call():,long_function_call() 将永远不会被评估。这对于and 与if True == False and long_function_call(): 类似。在编写条件语句时考虑这一点最符合您的利益,并且可能会导致性能发生变化。
【讨论】:
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 也没有对此代码进行任何进一步的优化!
【讨论】: