问题很简单,我有以下代码在python2中执行相同的操作:
for _ in range(n): # or xrange(),they have similar performance according to my test
pass
i = 0
while i < n:
i+=1
pass
for循环比while循环快,当n = 1000000时,每个大约需要0.105544和0.2389421
def generator(n):
i = 0
while i < n:
yield i
i += 1
答案 0 :(得分:2)
我希望您所看到的性能差异与Python中定义的代码部分以及在解释器中定义的部分有关(在C中,对于cpython)。例如,在next
循环情况下对for
的调用将在C中处理,对于range
或其他内置迭代,函数的实现将也是在C,所以它可能很快。另一方面,while
循环的边界检查是一个Python表达式,需要在循环的每次传递中进行评估。 Python代码几乎总是比C代码慢,所以在某些情况下for
循环可能比while
循环更快,这并不太令人震惊。
但请注意,这两种循环可能比您在其中可能执行的任何有用工作快得多。将这些努力集中在像这样的不同类型的循环之间的非常小的性能差异上,而不是像算法的复杂性或数据结构的效率这样的大问题上几乎是不值得的。
唯一的例外可能是您已经对代码进行了大量分析,并发现特定循环是特定程序的最大性能瓶颈。如果是这种情况,请根据您的内心进行微观优化。