Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
生成器是否比python中的while循环快?_Python_Performance_For Loop_While Loop_Coroutine - Fatal编程技术网

生成器是否比python中的while循环快?

生成器是否比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

问题很简单,我有以下代码在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循环比while循环快,当n=1000000时,每个循环大约需要0.105544和0.2389421

  • 从表面上看,当loop执行增量边界检查时,它看起来很像,但据我所知,生成器或迭代器必须执行相同数量的艰苦工作,因此如果完成的工作相同,为什么一个比另一个快

    def发生器(n): i=0 而i
  • 在迭代器的情况下,通常有一个成员函数被调用next,每次调用它时,它都会返回“iterable中的下一项”,对我来说,这意味着大量的函数调用,从而在堆栈上产生了巨大的开销(更多的汇编代码用于push和pop堆栈)并基于我对协同例程的了解(生成器),它试图通过创建一个新的分离堆栈来避免这种情况(就像线程一样,它管理自己的程序计数器),尽管它不再处理大量的函数调用,但它与线程具有相同的问题,即上下文切换的开销
    当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