我正在编写一个脚本来解析用户输入,读取文件,做一些工作,然后发送一个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()
答案 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(如果它)来节省一些时间。可迭代的)或早期返回(如果它是一个功能)。