【发布时间】:2017-09-30 15:02:22
【问题描述】:
考虑这个例子:
from itertools import cycle
def foo():
for i in range(3):
yield i
c = cycle(foo())
next(c) # -> 0
next(c) # -> 1
next(c) # -> 2 [StopIteration should be thrown here normally]
next(c) # -> 0
...
cycle 如何防止生成器通过StopIteration 激发?我认为生成器只能执行一次,因为生成器只返回其当前值并继续前进。
cycle 是否只是在抛出 StopIteration 时重新创建生成器?当我迭代例如大型 numpy 数组时,这会成为一个问题(效率低下)吗?
第二个问题:这是用迭代器/生成器循环大型数据集的“pythonic”方式吗?或者我应该将循环逻辑直接转移到生成器本身(比如定义索引和使用带有重置索引的 while 循环)?
我的目的是高效地循环浏览大型数据集(主要是 numpy 数组;>100.000 个条目)。
【问题讨论】:
标签: python numpy iterator generator cycle