python生成器上for循环迭代的效率

时间:2017-11-22 11:42:04

标签: python performance generator

我正在使用python中的生成器,我了解了生成器的优势。

考虑示例

mygenerator = (x*x for x in range(3))

案例A:

for i in mygenerator:   
    print i

在上面的例子中说,我使用

而不是for循环

案例B:

next(mygenerator)

案例A和案例B在复杂性方面是否相同?

我的意思是如果我使用for循环,就像案例A一样,我会从发电机中受益吗?或者我是否总是必须使用next()来获得更好的福利?

1 个答案:

答案 0 :(得分:4)

首先,next() 不等同于next()在迭代器中生成下一个值,它不是使用循环的for的替代值。

您必须使用while True循环:

while True:
    try:
        i = next(mygenerator)
    except StopIteration:
        break

这是较慢的,因为这涉及重复的next名称解析。否则效率不高。

for在生成器上使用iter()(将返回self),然后在内部调用next()调用的同一方法__next__()方法在迭代器上。

最终,您可以使用timeit module来测试某些内容是否更有效(效果更好):

 >>> from timeit import timeit
>>> while_loop = '''\
... while True:
...     try:
...         i = next(g)
...     except StopIteration:
...         break
...
... '''
>>> timeit('for i in g: pass', 'g = (x*x for x in range(1000000))')
0.15362663206178695
>>> timeit(while_loop, 'g = (x*x for x in range(1000000))')
0.568918940029107

因此,对于生成100万个项目的生成器,for循环几乎快4倍。

生成器函数和生成器表达式的优点是内存效率,并且在许多情况下,代码清晰度。 fornext()是两种截然不同的用例,用于从您的生成器获取值,使用您手头的问题所需的内容。