生成器是否比python中的while循环快?
问题很简单,我有以下代码在python2中做同样的事情:生成器是否比python中的while循环快?,python,performance,for-loop,while-loop,coroutine,Python,Performance,For Loop,While Loop,Coroutine,问题很简单,我有以下代码在python2中做同样的事情: for _ in range(n): # or xrange(),they have similar performance according to my test pass i = 0 while i < n: i+=1 pass 对于范围(n):#或xrange(),根据我的测试,它们具有类似的性能 通过 i=0 而i
for _ in range(n): # or xrange(),they have similar performance according to my test
pass
i = 0
while i < n:
i+=1
pass
对于范围(n):#或xrange(),根据我的测试,它们具有类似的性能
通过
i=0
而i
for循环比while循环快,当n=1000000时,每个循环大约需要0.105544和0.2389421
当while循环没有遇到我上面提到的任何开销时,它怎么能变得更慢呢
我希望您看到的性能差异与Python中定义的代码部分和解释器中定义的代码部分有关(C中,对于cpython)例如,在
循环的中,对下一个的调用将在C中处理,而对于范围或其他内置iterable,函数的实现也将在C中,因此可能会非常快。另一方面,而循环的边界检查是一个Python表达式,需要Python代码几乎总是比C代码慢,因此在某些情况下,for
循环可能比while
循环快,这并不令人震惊
但是请注意,这两种循环可能比您在它们内部所做的任何有用的工作都要快得多。几乎不值得将精力集中在不同类型循环之间的微小性能差异上,而不是集中在更大的问题上,如算法的复杂性或效率您的数据结构
唯一的例外可能是,如果您对代码进行了大量分析,发现特定循环是特定程序的最大性能瓶颈。如果是这种情况,请对您的核心内容进行微优化。您很可能是正确的,而不是对范围(n)中的i调用:
我将其替换为for I in generator(n):
其中generator()
是我在问题中定义的函数,for循环要慢得多(0.31012297)。我对Cpython不是很熟悉,你能详细说明它如何处理而for range(),for generator()吗
不同?cpython是标准的Python解释器(来自)。我不会深入探讨为什么一个循环比另一个循环快,因为正如我在回答中所说的,差异可能远小于您需要对代码执行的任何其他操作所花费的时间。只需使用最自然的循环类型,并在发现特定性能问题时进行优化M
def generator(n):
i = 0
while i < n:
yield i
i += 1