簡體   English   中英

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

[英]In python, can I lazily generate copies of an iterator using tee?

我正在嘗試創建一個迭代器,它可以懶惰地創建(可能是無限多個)迭代器的副本。 這可能嗎?

我知道我可以通過簡單地創建任何固定的有限數量的副本

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)更好),但不能處理無限數量的無限迭代器。 如果您對詳細信息感興趣,這里是拉取請求

這在 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__是作為可復制迭代器項目的一部分添加的,該項目沒有去任何地方。)

請注意,這將需要存儲原始迭代器生成的每個元素,這可能會變得非常昂貴。 沒有辦法避免這個成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM