性能来自if:pass语句

时间:2016-06-30 12:47:30

标签: python performance if-statement

我正在编写一个脚本来解析用户输入,读取文件,做一些工作,然后发送一个html POST请求。

代码中有一部分要求我根据三个变量的相互作用执行不同的操作,但有些情况是通过“什么也不做”来处理的。即pass。最初,我包含了所有pass条件路径,以帮助其他不熟悉此脚本/ Python的员工的可维护性。

所以有了这些信息,我的问题是:

如果删除这些pass路径,是否会有任何性能加速?这些语句不在将在其他任何地方导入的模块中,它将从命令行运行。

原始代码如下:

if var1 is not None:
    if var3 == var1 or var3 == 'SPECIFIC VALUE':
        xml.update_element()
        xml.remove_element()
    elif var2 == var3:
        pass
    else:
        xml.update_element()
else:
    if var3 == 'SPECIFIC VALUE':
        pass
    elif var2 != var3:
        xml.update_element()
        xml.create_element()

我改为:

if var1 is not None:
    if var3 == var1 or var3 == 'SPECIFIC VALUE':
        xml.update_element()
        xml.remove_element()
    elif var2 != var3:
        xml.update_element()
else:
    if var3 != 'SPECIFIC VALUE' and var2 != var3:
        xml.update_element()
        xml.create_element()

3 个答案:

答案 0 :(得分:2)

我的建议是为了提高可读性:如果您的代码将被许多人阅读,请尽可能简单易懂。其他任何事情都会过早优化。

您实际上可以使用the timeit module进行测试,以确定速度增益是否显着。如果他们不是,请忘记他们,让您的程序可读。

答案 1 :(得分:1)

在许多情况下,如果条件实际上加速了程序(因为我们正在跳过代码块)。但事实并非如此,因为在这些区块内没有做任何事情。

如果您正在检查的条件需要处理,那么大量if语句将减慢代码执行的唯一时间。一个例子就是(只是为了说明一点,它什么都不做):

while True:
    if sum(alist) == 0:
        pass

循环的每次迭代都会检查sum(alist) == 0。这意味着每次迭代时,解释器都必须对数组的元素求和,因为它可能已经改变了。

如果具有pass的块不应产生显着差异,那么性能明智,但这一切都取决于您正在检查的条件。这些顺序将取决于程序本身。

然而,if语句太多会降低代码的可读性。在许多情况下,如果您可以删除条件而不影响代码的行为,那么您不需要它开始。

对于所示的修改,它在(外部)if块上没有区别 - 实际上应该是相同的,因为在两种情况下都有两个要检查的条件。

if var1 is not None:
    ## CONDITION 1
    if var3 == var1 or var3 == 'SPECIFIC VALUE':
        xml.update_element()
        xml.remove_element()
    ## CONDITION 2
    elif var2 == var3:
        pass
    ## NO CONDITION TO CHECK
    else:
        xml.update_element()

在修改版中:

if var1 is not None:
    ## CONDITION 1
    if var3 == var1 or var3 == 'SPECIFIC VALUE':
        xml.update_element()
        xml.remove_element()
    ## CONDITION 2
    elif var2 != var3:
        xml.update_element()

但是在(外部)else块上你删除了其中一个条件,因此在某些情况下你会节省一些时间(并且更具可读性)。

else:
    ## CONDITION 1
    if var3 == 'SPECIFIC VALUE':
        pass
    ## CONDITION 2
    elif var2 != var3:
        xml.update_element()
        xml.create_element()

在修改版本中:

else:
    ## ONLY 1 CONDITION
    if var3 != 'SPECIFIC VALUE' and var2 != var3:
        xml.update_element()
        xml.create_element()

如果它很重要或只是你的定时测试可以说明。即使条件稍微复杂一点,如果var3 == 'SPECIFIC VALUE'它立即返回false并且不检查第二个条件。

答案 2 :(得分:0)

唯一真正的性能影响将是您必须评估进入语句的复杂条件。我必须看到您的代码片段,但您可以通过检查块顶部附近最简单/最常见的条件并使用continue vs. pass(如果它)来节省一些时间。可迭代的)或早期返回(如果它是一个功能)。