La forma más rápida de convertir un iterador en una lista

185

Teniendo un iteratorobjeto, ¿hay algo más rápido, mejor o más correcto que una comprensión de lista para obtener una lista de los objetos devueltos por el iterador?

user_list = [user for user in user_iterator]
systemmpuntoout
fuente
1
Antes de optimizar esto, asegúrese de haber hecho algunos perfiles para demostrar que este es realmente el cuello de botella.
S.Lott
1
@ S.Lott. Normalmente estoy de acuerdo con esa actitud pero, en este caso, debería optimizarse mucho estilísticamente, lo que, como suele ser el caso con Python, también lo optimizará para la velocidad.
aaronasterling
3
El OP no dijo nada acerca de tener un cuello de botella. Es una pregunta general perfectamente buena con una respuesta simple, no necesita depender de una aplicación específica que se pueda ejecutar a través de un generador de perfiles.
Ken Williams
44
La forma más compacta es [*iterator].
Challenger5

Respuestas:

336
list(your_iterator)
Mikerobi
fuente
55
En realidad, casi siempre un poco más rápido. Además, mucho más obvio.
Thomas Wouters
8
@systempuntoout Se ejecuta completamente en C. La comprensión de la lista está en python. Por supuesto que corre más rápido.
aaronasterling
3
Todavía odio totalmente que no haya una mejor manera en Python. Es tedioso tener que editar ambos lados de una expresión solo para poder cortarla o indexarla. (muy común en python3, si es una expresión pura como zip, o un mapa con una función pura)
Jo So
Hmm import matplotlib.pyplot as plt' followed by ax = plt.gca () `y list(ax._get_lines.prop_cycler)da como resultado un bucle infinito. ¿Hay alguna forma elegante de manejar esto?
Jens Munk
55
En mis pruebas rápidas, [*your_iterator]parecía ser aproximadamente el doble de rápido que list(your_iterator). ¿Es esto generalmente cierto, o fue solo una ocasión específica? (Utilicé un mapcomo iterador.)
Neinstein
11

desde python 3.5 puede usar el *operador de desempaquetado iterable:

user_list = [*your_iterator]

pero la forma pitónica de hacerlo es:

user_list  = list(your_iterator)
Kederrac
fuente