2024-04-19 23:47:54 发布
网友
我有一个生成器对象由多个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)
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
发电机不能重绕。您有以下选项:
再次运行生成器功能,重新启动生成:
将生成器结果存储在内存或磁盘上的数据结构中,您可以再次迭代:
option1的缺点是它再次计算值。如果这是CPU密集型,你最终会计算两次。另一方面,2的缺点是存储。整个值列表将存储在内存中。如果价值观太多,那就不切实际了。
所以你有经典的内存与处理的权衡。我无法想象在不存储值或重新计算值的情况下重绕生成器的方法。
另一个选项是使用^{} 函数创建生成器的第二个版本:
如果原始迭代可能无法处理所有项,那么从内存使用的角度来看,这可能是有益的。
相关问题 更多 >
编程相关推荐