在python中,我可以使用tee懒惰地生成迭代器的副本吗?

时间:2015-05-14 08:17:40

标签: python iterator lazy-evaluation

我正在尝试创建一个迭代器,它懒惰地创建(可能是无限多个)迭代器的副本。这可能吗?

我知道只需执行

即可创建任何固定的有限数量的副本
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

1 个答案:

答案 0 :(得分:2)

在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的一部分,但没有去任何地方。)

请注意,这将需要存储原始迭代器生成的每个元素,这可能会非常昂贵。没有办法避免这笔费用。