使用 zip(*tuple_iterator) 而不消耗 tuple_iterator 在此行

using zip(*tuple_iterator) without consuming the tuple_iterator at this line

我有一个 tuple_iterator : Iterator[Tuple[A, B]] 我想得到一个 iterator_tuple: Tuple[Iterator[A], Iterator[B]] 这原则上可以使用 iterator_a, iterator_b = zip(*tuple_iterator) 来完成 但是,zip中的*一开始就消耗了整个tuple_iterator,导致大量计算。

我宁愿有一个迭代器元组,它在需要数据之前不处理数据。如果我先使用 iterator_a,代码应该缓存 iterator_b 的结果,直到我使用 iterator_b。如果反之亦然,使用它会更干净,更不容易出错。

背景信息:在消耗 iterator_a 的元素之间,我想开始异步操作。

你有什么建议吗?

如果不提高“B”的值,就不能提高“A”。这告诉我,您必须使用 itertools.tee 创建原始迭代器的副本(两个副本,丢弃原始副本),并从任一生成的副本中获取第一项和第二项。

tee 的实现不会消耗比实际需要更多的内存。如果同时推进两个迭代器,它的开销应该很小。

import itertools
aux_iter_a, aux_iter_b = itertools.tee(tuple_iterator)
# would have to use next(aux_iter_a)[0] and next(aux_iter_b)[1]
iterator_a = (item[0] for item in aux_iter_a)
iterator_b = (item[1] for item in aux_iter_b)

more_itertools 包含一个完全符合我要求的方法:

iterator_a, iterator_b = more_itertools.unzip(tuple_iterator)