Von einer previous question habe ich etwas Interessantes gelernt. Wenn Pythons itertools.product
eine Reihe von Iteratoren erhält, werden diese Iteratoren in Tupel konvertiert, bevor das kartesische Produkt beginnt. Relatedquestions Betrachten Sie den Quellcode von itertools.product
um zu schließen, dass, während keine Zwischenergebnisse im Speicher gespeichert sind, Tupel-Versionen der ursprünglichen Iteratoren erstellt werden, bevor die Produkt-Iteration beginnt.Kartesisches Produkt großer Iteratoren (itertools)
Frage: Gibt es eine Möglichkeit, einen Iterator auf ein Kartesisches Produkt, wenn das (Tupel umgewandelt) Eingänge sind zu groß zu halten, im Speicher zu schaffen? Triviales Beispiel:
import itertools
A = itertools.permutations(xrange(100))
itertools.product(A)
Ein praktischer Anwendungsfall würde in einer Reihe von (*iterables[, repeat])
wie die ursprünglichen Implementierung der Funktion übernehmen - die oben nur ein Beispiel ist. Es sieht nicht so aus, als könntest du die aktuelle Implementierung von itertools.product
verwenden, also begrüße ich dich in reiner Python (obwohl du das C-Backend von itertools
nicht schlagen kannst!).
Wie schlagen Sie vor, dass die Produkte dann produziert werden? Sie müssten '.tee()' verwenden, was Iteratoren auch zwischenspeichert, um ihre Arbeit zu erledigen. –
Alternativ würden Sie neu startbare Iteratoren benötigen, z. Du kannst dein Ziel nur dann erreichen, wenn du jeden Iterator irgendwie neu erstellen kannst, um genau die gleichen Ergebnisse zu erzielen wie während des vorherigen vollständigen Laufs. –
@MartijnPieters Ich bin mir nicht sicher (daher die Frage!). Der Kern der Frage ist, geben Sie eine äußere Produkt-Implementierung ohne Zwischenspeicherung. Möglich in 'itertools', ich bin mir nicht sicher - in reinem Python denke ich, dass es möglich ist, da wir einen Iterator" neu starten "können, indem wir ihn jedes Mal neu aufsetzen. – Hooked