为什么发电机更快?

2024-09-28 20:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道生成器比迭代器快。我还了解生成器可以使用for循环语法来实现。例如:

    import time 


startT = time.time()


def myGen(n):
    for i in range(n):
        yield x         


def myIter(n):
    for i in range(n):
        pass

def main():
    n=100
    startT=time.time()
    myIter(n)
    print 'myIter took ', time.time() - startT

    startT=time.time()
    myGen(n)
    print 'myGen(n) took ', time.time() - startT

这只是结果的一个例子:

^{pr2}$

因为它使用for循环语法,所以我不明白它怎么比迭代器快。此生成器使用迭代器,因为“for”循环是使用迭代器实现的。如果你对这些进行计时,生成器的速度会一直更快。当生成器使用迭代器时,为什么会这样?在

谢谢。在


Tags: inimportfortimemaindef语法range
1条回答
网友
1楼 · 发布于 2024-09-28 20:49:47

在您的代码中,myIter(n)实际上可以循环100次。在

另一方面,myGen(n)只需构建生成器就可以了。不算100。你所做的只是计时构建对象所需的时间,而你的计时方式并不可靠。如果我们使用timeit(这里使用IPython使事情更简单):

>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit myGen(100)
10000000 loops, best of 3: 163 ns per loop
>>> %timeit myGen(10**1000)
10000000 loops, best of 3: 163 ns per loop

我们看到myGen(n)时间与n无关,因为它什么都不做。实际上,我们可以看到您的代码从未以其他方式执行过:

^{pr2}$

如果我们修复了这个错误,然后尝试一种快速的方法来消耗生成器,我们得到的结果是

>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit consume(myGen(100), 100)
100000 loops, best of 3: 3.44 µs per loop

而且发电机版本的速度较慢,这是经常发生的情况。在

相关问题 更多 >