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]

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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.