python - 为什么生成器更快?

标签 python iterator generator

我知道生成器比迭代器快。我还了解到可以使用 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

这只是结果的一个例子:

myIter took 0.09234782
myGen(n) took 0.017847266

由于这使用了for 循环语法,所以我不明白它为什么比迭代器快。这个生成器使用迭代器,因为“for”循环是使用迭代器实现的。如果你对这些进行计时,生成器会始终更快。当生成器使用迭代器时,这是为什么?

谢谢。

最佳答案

在您的代码中,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,因为它没有做任何事情。事实上,我们可以看到您的代码从未以其他方式执行过:

>>> list(myGen(100))
Traceback (most recent call last):
  File "<ipython-input-11-dd43d937402a>", line 1, in <module>
    list(myGen(100))
  File "<ipython-input-1-ba968e48e9fd>", line 3, in myGen
    yield x
NameError: name 'x' is not defined

如果我们修复这个错字,然后尝试一种快速的方法来使用生成器,我们会得到类似的结果

>>> %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

并且生成器版本较慢,这是经常发生的情况。

关于python - 为什么生成器更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31766728/

相关文章:

python - Plotly:躲避散点图分类轴上的重叠点

python - 对字典的项目应用一个函数

python - 如何使用 .cer 文件作为 python 请求的一部分

java - 如何迭代数组列表并根据条件添加或删除对象?

javascript - 围绕对象键的数组符号

python - 任何存在内存使用的对象,如生成器,但可以在必要时返回一个 numpy 数组?

python - 从 python 中的函数更新 ipywidget 下拉列表

python - itertools中chain和chain.from_iterable有什么区别?

c++ - 为什么在 C++11 中使用非成员开始和结束函数?

javascript - 将函数 * 提升为异步函数 *?