Los iteradores de Python pueden ser muy eficientes en memoria. ¿Debería preferir siempre usar generadores en lugar de solo listas? ¿En qué situaciones debería preferir una matriz simple?
Por ejemplo en lugar de esto:
emails = [user.email for user in users]
debería preferir esto ?:
emails = (user.email for user in users)
Nota : quiero decir 'generadores' no 'iteradores'.
python
performance
Nicholaides
fuente
fuente
Respuestas:
El principal inconveniente de los generadores es que solo pueden atravesarse en una dirección. No hay vuelta atrás a un valor anterior. Tampoco puedes compartirlos. Hay muchos casos en los que eso puede explicarse fácilmente, o incluso donde es preferible, pero también hay muchos casos en los que no lo es. Clasificación, por ejemplo.
Es por eso que muchas veces verá generadores utilizados para las etapas iniciales de procesamiento de una gran cantidad de datos, luego, una vez que se filtra en un subconjunto y se mapea en un formato agradable, se coloca en una estructura de datos concreta de larga duración para uso posterior. De esta forma, no gasta la asignación de memoria, errores de caché y costos de recolección de basura para matrices intermedias grandes que tirará inmediatamente.
fuente
Tienes iteradores confundidos con generadores.
Su primer ejemplo es una expresión de iterador de lista, mientras que el segundo es una expresión generadora. La diferencia clave es que el generador crea cada miembro de la colección dada de forma perezosa (según sea necesario) en lugar de con entusiasmo (a la vez, sea necesario o no). Puede definir sus propios generadores utilizando el rendimiento en lugar del retorno.
En cuanto al uso, desea un iterador cuando necesita la lista (o diccionario o lo que sea) para algo en sí mismo. Usaría un generador cuando la colección sea incidental al producto final. Por ejemplo, puede usar un generador para obtener una lista de números que satisfacen algunos criterios de otros criterios. No le importa la lista original, solo los miembros que cumplen con los criterios. Por lo tanto, utiliza un generador para obtener solo esos números.
Un ejemplo más concreto sería encontrar los ángulos de triángulos cuyos lados tienen una longitud dada. No queremos todos los triángulos fallidos pobres y deformados, solo los triángulos exitosos fuertes y saludables. Por lo tanto, usaríamos un generador.
Esta publicación de desbordamiento de pila entra en más detalles.
fuente