Da un previous question ho imparato qualcosa di interessante. Se Python itertools.product
viene alimentato con una serie di iteratori, questi iteratori verranno convertiti in tuple prima del. Inizia il prodotto cartesiano. Relatedquestions guardare il codice sorgente di itertools.product
per concludere che, mentre nessun risultato intermedio è memorizzato in memoria, le versioni di tuple degli iteratori originali vengono create prima dell'inizio dell'iterazione del prodotto.Prodotto cartesiano di grandi iteratori (itertools)
Domanda: C'è un modo per creare un iteratore su un prodotto cartesiano quando gli ingressi (convertiti nella tupla) sono troppo grandi per essere conservati in memoria? banale esempio:
import itertools
A = itertools.permutations(xrange(100))
itertools.product(A)
più pratica caso d'uso prenderebbe in una serie di (*iterables[, repeat])
come l'implementazione originale della funzione - quanto sopra è solo un esempio. Non sembra che tu possa usare l'attuale implementazione di itertools.product
, quindi accolgo con favore in sottomissione in puro python (anche se non puoi battere il backend C di itertools
!).
Come si propone che i prodotti vengano quindi prodotti? Dovresti usare '.tee()' che memorizza nella cache gli iteratori per fare il loro lavoro. –
In alternativa, avresti bisogno di iteratori re-startable, ad es. puoi raggiungere il tuo obiettivo solo se in qualche modo puoi creare ogni iteratore a-nuovo, per produrre gli stessi risultati identici durante la precedente esecuzione completa. –
@MartijnPieters Non sono sicuro (da qui la domanda!). Il cuore della domanda è, dare un'implementazione di prodotto esterno senza alcun deposito intermedio. Possibile in 'itertools', non ne sono sicuro - in Python puro, penso che sia possibile in quanto possiamo" riavviare "un iteratore aggiungendolo ogni volta che è necessario. – Hooked