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

dsh*_*erd 3 python iterator lazy-evaluation

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

我知道我可以通过简单地创建任何固定的有限数量的副本

from itertools import tee
iter_copies = tee(my_iter, n=10)
Run Code Online (Sandbox Code Playgroud)

但如果您事先不知道 n 或者 n 是无限的,那么这种情况就会失败。

我通常会尝试一些类似的事情

from itertools import tee

def inf_tee(my_iter):
    while True:
        yield tee(my_iter)[1]
Run Code Online (Sandbox Code Playgroud)

但文档指出,在迭代器上使用 tee 后,原始迭代器将无法再使用,因此这不起作用。


如果您对该应用程序感兴趣:其想法是创建一个惰性函数,可能在pytoolzunzip中使用。我当前的实现可以处理有限数量的无限迭代器(这比 plain 更好),但不能处理无限数量的无限迭代器。如果您对详细信息感兴趣,请参阅以下拉取请求。zip(*seq)

use*_*ica 5

这仅在 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)
Run Code Online (Sandbox Code Playgroud)

文档中的示例实际上使用了__copy__magic 方法,即用于自定义行为的钩子copy.copy。(显然tee.__copy__是作为可复制迭代器项目的一部分添加的,但该项目没有去任何地方。)

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