Il modo più veloce per convertire un iteratore in un elenco


185

Avere un iteratoroggetto, c'è qualcosa di più veloce, migliore o più corretto di una comprensione dell'elenco per ottenere un elenco degli oggetti restituiti dall'iteratore?

user_list = [user for user in user_iterator]

1
Prima di ottimizzarlo, assicurati di aver fatto un po 'di profilazione per dimostrare che questo è davvero il collo di bottiglia.
S.Lott

1
@ S. Lott. Di solito sono d'accordo con quell'atteggiamento, ma, in questo caso, dovrebbe essere ottimizzato stilisticamente che, come spesso accade con Python, lo ottimizzerà anche per la velocità.
aaronasterling,

3
L'OP non ha detto nulla sull'avere un collo di bottiglia. È una domanda generale perfettamente soddisfacente con una risposta semplice, non ha bisogno di dipendere da un'applicazione specifica che può essere eseguita attraverso un profiler.
Ken Williams,

4
Il modo più compatto è [*iterator].
Challenger5

Risposte:


336
list(your_iterator)

5
In realtà, quasi sempre un po 'più veloce. Inoltre, molto più ovvio.
Thomas Wouters,

8
@systempuntoout Funziona interamente in C. La comprensione dell'elenco è in Python. Certo che corre più veloce.
aaronasterling,

3
Odio ancora del tutto il fatto che non ci sia modo migliore in Python. È noioso dover modificare entrambi i lati di un'espressione solo per essere in grado di suddividerla o indicizzarla. (molto comune in python3, se si tratta di un'espressione pura come zip o di una mappa con una funzione pura)
Jo So

Hmm. import matplotlib.pyplot as plt' followed by ax = plt.gca () `e list(ax._get_lines.prop_cycler)genera un ciclo infinito. Esiste un modo elegante per gestirlo?
Jens Munk,

5
Nei miei test rapidi, [*your_iterator]sembrava essere circa due volte più veloce di list(your_iterator). È generalmente vero, o era solo un'occasione specifica? (Ho usato un mapiteratore.)
Neinstein,

11

da Python 3.5 è possibile utilizzare l' *operatore di decompressione iterabile:

user_list = [*your_iterator]

ma il modo pitone per farlo è:

user_list  = list(your_iterator)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.