我正在使用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()
来获得更好的福利?
答案 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倍。
生成器函数和生成器表达式的优点是内存效率,并且在许多情况下,代码清晰度。 for
和next()
是两种截然不同的用例,用于从您的生成器获取值,使用您手头的问题所需的内容。