有时我需要检查循环内不会改变的条件,这意味着测试在每次迭代中都会被评估,但我认为这并不是正确的方法。
我认为既然条件在循环内不会改变,那么我应该在循环外仅测试一次该条件,但这样做将不得不"重复自己",可能需要写多个相同的循环。下面是演示我的代码:
这表明,显然,在循环外进行一次测试可以获得更好的性能,但我不得不写两个相同的循环(如果有一些
我知道在大多数情况下这种性能并不重要,但我需要知道编写此类代码的最佳方法。例如,是否有一种方法可以告诉Python仅评估一次测试?
感谢任何帮助。
编辑:
实际上,经过一些测试后,我现在相信性能差异主要受到循环内执行的其他代码的影响,而不是测试的评估。因此,目前我将坚持第一种形式,这种形式更易读,并且以后更易于调试。
我认为既然条件在循环内不会改变,那么我应该在循环外仅测试一次该条件,但这样做将不得不"重复自己",可能需要写多个相同的循环。下面是演示我的代码:
#!/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
,则可能需要写更多)。我知道在大多数情况下这种性能并不重要,但我需要知道编写此类代码的最佳方法。例如,是否有一种方法可以告诉Python仅评估一次测试?
感谢任何帮助。
编辑:
实际上,经过一些测试后,我现在相信性能差异主要受到循环内执行的其他代码的影响,而不是测试的评估。因此,目前我将坚持第一种形式,这种形式更易读,并且以后更易于调试。
break
来跳出循环。 - Samy Vilar