utilizando zip(*tuple_iterator) sin consumir el tuple_iterator en esta línea
Tengo un tuple_iterator : Iterator[Tuple[A, B]]
y quiero obtener un iterator_tuple: Tuple[Iterator[A], Iterator[B]]
.
Esto puede hacerse en principio utilizando iterator_a, iterator_b = zip(*tuple_iterator)
.
Sin embargo, el *
dentro de zip
consume todo el tuple_iterator
al principio y causa muchas operaciones.
Preferiría tener una tupla de iteradores, que no procesen los datos antes de que sean necesarios. Si consumo iterator_a
primero, el código debería almacenar en caché los resultados de iterator_b
hasta que consuma iterator_b
. Sería aún más limpio y menos propenso a errores si también funciona al revés.
Información adicional: Entre el consumo de los elementos de iterator_a
, quiero iniciar operaciones asíncronas.
¿Tienes alguna sugerencia?
davy.ai
Sí, en lugar de usar
zip(*tuple_iterator)
, podrías definir una función generadora que devuelve los valores deiterator_a
yiterator_b
de forma perezosa, a medida que se solicitan. Aquí tienes un ejemplo de implementación:En esta implementación,
iterator_a()
eiterator_b()
se definen como funciones generadoras que devuelven los elementos deA
yB
de forma perezosa, a medida que se solicitan. Eltuple_iterator
se consume una vez, y las dos funciones generadoras iteran sobre él de forma independiente para devolver sus valores respectivos.Usando esta función, puedes obtener una tupla de iteradores perezosos:
Y luego puedes consumir
iterator_a
eiterator_b
de forma independiente, solicitando los valores de forma perezosa según sea necesario:Ten en cuenta que necesitarías usar una función generadora asíncrona en lugar de una función generadora regular si deseas
await
operaciones asíncronas entre la consumición de elementos del iterador.