我正在尝试创建一个迭代器,它懒惰地创建(可能是无限多个)迭代器的副本。这可能吗?
我知道我可以通过简单地创建任何固定的有限数量的副本
iter_copies = tee(my_iter, n=10)
但如果你不提前知道或者n是无限的,那么这就会崩溃。
我通常会尝试一些方法
def inf_tee(my_iter):
while True:
yield tee(my_iter)[1]
但文档说明在迭代器上使用tee后,原始迭代器不能再使用,所以这不起作用。
如果您对该应用程序感兴趣:想法是创建一个懒惰的unzip
函数,可能用于pytoolz。我当前的实现可以处理有限数量的无限迭代器(这比普通的zip(*seq)
更好),但不是无限数量的无限迭代器。如果您对细节感兴趣,这里是pull request。
这只是在Python 2 itertools
文档底部附近的一个例子中几乎没有涉及,但是itertools.tee
支持复制:
import itertools, copy
def infinite_copies(some_iterable):
master, copy1 = itertools.tee(some_iterable)
yield copy1
while True:
yield copy.copy(master)
文档中的示例实际上使用了__copy__
魔术方法,这是用于自定义copy.copy
行为的钩子。 (显然tee.__copy__
被添加为copyable iterators project的一部分,没有去任何地方。)
请注意,这将需要存储原始迭代器生成的每个元素,这可能会非常昂贵。没有办法避免这个成本。