有效地合并两个迭代器



需要设计一个需要巨大迭代器的方法,假设大小为 n,对其执行操作 min/max/etc 的操作仅用于 m 次迭代,最后方法必须返回操作的输出和输入迭代器的副本。

n 趋向于无穷大,m 趋向于小于 n 的正数。

copy_it =  merge(poped_iter, it)

使用 itertools.tee 可以克隆 iter,但是在内部它会迭代 iter,如果 iter 很大,则需要大约 n 个时间。我正在寻找一种在不迭代的情况下合并两个迭代器的方法。

def some_operation_and_copy_iter(it: iter, m: int) -> (int, iter):
import itertools
it, copy_it = itertools.tee(it)
poped_data = []
# Some operation on it
max = -1
i = 0
while i < m:
data = next(it)
poped_data.append(data)
if data >= max:
max = data
i += 1
poped_iter = iter(poped_data)
# copy_it =  merge(poped_iter, it)
return max, copy_it

max, it = some_operation_and_copy_iter(iter(range(0, 1000000)), 100)
assert max == 99
assert list(it) == list(iter(range(0, 1000000)))

当操作需要对迭代器的子集进行操作时,在more_itertools中使用可视。 速览操作在迭代器的子集上运行,大小相对较小。

from more_itertools import peekable
peekable_iter = peekable(iter(range(0, 1000000)))
m = 100
max_value = max(peekable_iter[0:m])
# do some operation on peekable_iter

最新更新