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.