【问题标题】:In python, can I lazily generate copies of an iterator using tee?在 python 中,我可以使用 tee 懒惰地生成迭代器的副本吗?
【发布时间】:2015-05-14 08:17:39
【问题描述】:

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

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

from itertools import tee
iter_copies = tee(my_iter, n=10)

但是如果你不提前知道 n 或者 n 是无限的,这就会失败。

我通常会尝试一些类似的东西

from itertools import tee

def inf_tee(my_iter):
    while True:
        yield tee(my_iter)[1]

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


如果您对该应用程序感兴趣:想法是创建一个惰性unzip 函数,可能用于pytoolz。我当前的实现可以处理有限数量的无限迭代器(比普通的zip(*seq) 更好),但不能处理无限数量的无限迭代器。如果您对详细信息感兴趣,这里是pull request

【问题讨论】:

    标签: python iterator lazy-evaluation


    【解决方案1】:

    这只是在 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 的一部分添加的,但它并没有出现在任何地方。)

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

    【讨论】:

    • 太棒了!奇怪的是,该示例(tee_lookahead 对吗?)在 2.7 文档中,但不在 3.4 文档中。你知道这样做是否有充分的理由吗?
    • @dshepherd:不知道。该方法在 Python 3 中仍然存在,但示例不在。
    猜你喜欢
    • 2019-04-19
    • 2018-04-17
    • 2019-06-20
    • 2011-12-31
    • 2010-09-26
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多