有时我必须检查一些在循环内不会改变的条件,这意味着在每次迭代中都会评估测试,但我认为这不是正确的方法。
我想既然条件在循环内没有改变,我应该只在循环外测试一次,但是我将不得不“重复自己”并且可能不止一次地编写同一个循环。这是显示我的意思的代码:
#!/usr/bin/python
x = True #this won't be modified inside the loop
n = 10000000
def inside():
for a in xrange(n):
if x: #test is evaluated n times
pass
else:
pass
def outside():
if x: #test is evaluated only once
for a in xrange(n):
pass
else:
for a in xrange(n):
pass
if __name__ == '__main__':
outside()
inside()
在前面的代码上运行cProfile
会得到以下输出:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.542 0.542 0.542 0.542 testloop.py:5(inside)
1 0.261 0.261 0.261 0.261 testloop.py:12(outside)
1 0.000 0.000 0.803 0.803 testloop.py:3(<module>)
这表明,显然,在循环外测试一次可以提供更好的性能,但是我必须编写两次相同的循环(如果有一些elif
s 可能会更多)。
我知道在大多数情况下这种性能并不重要,但我需要知道编写这种代码的最佳方式是什么。例如,有没有办法告诉 python 只评估一次测试?
任何帮助表示赞赏,谢谢。
编辑:
实际上,在进行了一些测试之后,我现在确信性能差异主要受循环中执行的其他代码的影响,而不是受测试评估的影响。所以现在我坚持使用第一种形式,它更易读,更适合以后调试。