使用 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)
我有一个 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)