De un previous question aprendí algo interesante. Si Python's itertools.product
se alimenta con una serie de iteradores, estos iteradores se convertirán en tuplas antes de comienza el producto cartesiano. Relatedquestions observe el código fuente de itertools.product
para concluir que, aunque no se almacenan en la memoria resultados intermedios, las versiones tuple de los iteradores originales se crean antes de que comience la iteración del producto.Producto cartesiano de iteradores grandes (itertools)
Pregunta: ¿Hay alguna manera de crear un iterador en un producto cartesiano cuando las entradas (convertidas en tupla) son demasiado grandes para mantenerlas en la memoria? ejemplo trivial:
import itertools
A = itertools.permutations(xrange(100))
itertools.product(A)
Un caso más práctico el uso tomaría en una serie de (*iterables[, repeat])
como la implementación original de la función - lo anterior es sólo un ejemplo. No parece que puedas usar la implementación actual de itertools.product
, así que doy la bienvenida en la presentación en python puro (aunque no puedes superar el backend C de itertools
).
¿Cómo propone que se produzcan los productos? Tendría que usar '.tee()' que también almacena en caché iteradores para hacer su trabajo. –
Alternativamente, necesitaría iteradores reiniciables, p. Ej. solo puedes lograr tu objetivo si de alguna manera puedes crear cada iterador a-new, para producir exactamente los mismos resultados que durante la ejecución completa previa. –
@MartijnPieters No estoy seguro (¡de ahí la pregunta!). El corazón de la pregunta es, dar una implementación externa del producto sin ningún almacenamiento intermedio. Posible en 'itertools', no estoy seguro, en Python puro, creo que puede ser posible, ya que podemos" reiniciar "un iterador con una nueva versión cada vez que sea necesario. – Hooked