[英]Why does a loop behave like this, (in conjunction with tee)?
我正在尝试迭代组合对。
尽管我已经找到了一种更好的方法,但是从概念和实用角度来看,这都是我的第一个冲动,我想知道为什么它不起作用。
gen = itertools.combinations(range(1, 6), 3)
for i in gen:
gen, gencopy = itertools.tee(gen)
for j in gencopy:
print(i, j)
提供以下输出:
(1,2,3)(1,2,4)
(1,2,3)(1,2,5)
(1、2、3)(1、3、4)
(1、2、3)(1、3、5)
(1、2、3)(1、4、5)
(1、2、3)(2、3、4)
(1、2、3)(2、3、5)
(1、2、3)(2、4、5)
(1、2、3)(3、4、5)
这意味着仅迭代一个i
。
但是,如果我将tee
线更改为:
_, gencopy = itertools.tee(gen)
我得到了完整的预期对。
(注意:自此以后,我发现执行此操作的最佳方法是简单地通过itertools.combinations
反馈生成器以返回组合对,并避免文档声称与tee一起出现的性能问题。但是,我想我对for循环的行为以及为什么以这种方式更改生成器导致其过早保释感到好奇。)
从文档中 :
一旦tee()进行了拆分,原始的可迭代对象就不应在其他任何地方使用; 否则,迭代器可能会提前,而不会通知tee对象。
在输出中使用多个迭代器时, tee
的想法是在迭代器之间共享对象(每个迭代器“消耗”原始列表)。
此itertool可能需要大量辅助存储(取决于需要存储多少临时数据)。 通常,如果一个迭代器在另一个迭代器启动之前使用了大部分或全部数据,则使用list()而不是tee()更快。
实际情况是:内部循环使用了所有数据,而外部循环立即退出。
该文档建议的解决方法:
gen = list(itertools.combinations(range(1, 6), 3))
for i in gen:
for j in gen:
print(i, j)
但是当然,这可能会占用大量内存,因为您从一开始就“杀死”了生成器功能。 因此,使用组合而不是双循环的想法可能是最好的。
相关问答: 如何克隆Python生成器对象?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.