在 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
function, potentially for use in pytoolz. My current implementation can handle a finite number of infinite iterators (which is better than plain zip(*seq)
), but not an infinite number of infinite iterators. Here's the 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 的一部分添加的,但没有任何意义。)
请注意,这将需要存储原始迭代器产生的每个元素,这可能会变得非常昂贵。没有办法避免这笔费用。
我正在尝试创建一个迭代器,它懒惰地创建(可能无限多)迭代器的副本。这可能吗?
我知道我可以通过简单地做
来创建任何固定的有限数量的副本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
function, potentially for use in pytoolz. My current implementation can handle a finite number of infinite iterators (which is better than plain zip(*seq)
), but not an infinite number of infinite iterators. Here's the 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 的一部分添加的,但没有任何意义。)
请注意,这将需要存储原始迭代器产生的每个元素,这可能会变得非常昂贵。没有办法避免这笔费用。