在Python中重置生成器对象

2024-04-19 23:47:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个生成器对象由多个yield返回。准备调用此生成器相当耗时。这就是为什么我要多次重用生成器。

y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)

当然,我想把内容复制到简单的列表中。


Tags: to对象in内容列表forherebe
3条回答

发电机不能重绕。您有以下选项:

  1. 再次运行生成器功能,重新启动生成:

    y = FunctionWithYield()
    for x in y: print(x)
    y = FunctionWithYield()
    for x in y: print(x)
    
  2. 将生成器结果存储在内存或磁盘上的数据结构中,您可以再次迭代:

    y = list(FunctionWithYield())
    for x in y: print(x)
    # can iterate again:
    for x in y: print(x)
    

option1的缺点是它再次计算值。如果这是CPU密集型,你最终会计算两次。另一方面,2的缺点是存储。整个值列表将存储在内存中。如果价值观太多,那就不切实际了。

所以你有经典的内存与处理的权衡。我无法想象在不存储值或重新计算值的情况下重绕生成器的方法。

另一个选项是使用^{}函数创建生成器的第二个版本:

y = FunctionWithYield()
y, y_backup = tee(y)
for x in y:
    print(x)
for x in y_backup:
    print(x)

如果原始迭代可能无法处理所有项,那么从内存使用的角度来看,这可能是有益的。

>>> def gen():
...     def init():
...         return 0
...     i = init()
...     while True:
...         val = (yield i)
...         if val=='restart':
...             i = init()
...         else:
...             i += 1

>>> g = gen()
>>> g.next()
0
>>> g.next()
1
>>> g.next()
2
>>> g.next()
3
>>> g.send('restart')
0
>>> g.next()
1
>>> g.next()
2

相关问题 更多 >