我有一个由多个 yield 返回的生成器对象。准备调用这个生成器是相当耗时的操作。这就是为什么我想多次重复使用生成器。
y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)
当然,我正在考虑将内容复制到简单列表中。有没有办法重置我的发电机?
最佳答案
发电机不能倒带。您有以下选择:
再次运行生成器函数,重新开始生成:
y = FunctionWithYield()
for x in y: print(x)
y = FunctionWithYield()
for x in y: print(x)
将生成器结果存储在内存或磁盘上的数据结构中,您可以再次对其进行迭代:
y = list(FunctionWithYield())
for x in y: print(x)
# can iterate again:
for x in y: print(x)
选项 1 的缺点是它会再次计算值。如果那是 CPU 密集型的,你最终会计算两次。另一方面,2 的缺点是存储。整个值列表将存储在内存中。如果值太多,则可能不切实际。
所以你有经典的内存与处理权衡。我无法想象在不存储值或再次计算它们的情况下倒带生成器的方法。
https://stackoverflow.com/questions/1271320/