条件顺序是否会影响绩效?

时间:2016-10-09 17:11:35

标签: python performance conditional-statements

在脚本的速度方面,我如何在Python中命令条件是否重要?在例如SQL中它不是因为“口译员”假设哪个条件排序最快。

在Python中,据我所知,条件的顺序将由解释器给出。举个例子,如果我链条或者条件,最好是按照假定的时间对条件进行排序,因为当第一个条件不适用时,解释器可能会停止查找其他条件吗?

3 个答案:

答案 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)并提前退出andJUMP_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都没有对此代码进行任何进一步的优化!