¿Debo preferir los generadores de Python a las listas?

8

Los iteradores de Python pueden ser muy eficientes con la memoria. ¿Siempre prefiero 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]

¿Prefiero esto ?:

emails = (user.email for user in users)

Nota : quiero decir 'generadores' no 'iteradores'.

    
pregunta nicholaides 17.02.2015 - 22:18

2 respuestas

7

El principal inconveniente de los generadores es que solo se pueden atravesar en una dirección. No hay vuelta a un valor anterior. Tampoco puedes compartirlos. Hay muchos casos en los que eso se puede explicar fácilmente, o incluso cuando es preferible, pero también hay muchos casos en los que no se puede explicar. La clasificación, por ejemplo.

Es por eso que muchas veces verás que los generadores se usan para las etapas iniciales de procesamiento de una gran cantidad de datos, luego, una vez que se filtran en un subconjunto y se mapean en un formato agradable, se ponen en un concreto de larga duración. Estructura de datos para su uso posterior. De esa manera, no gastará la asignación de memoria, las fallas de caché y los costos de recolección de basura para los arreglos intermedios grandes que inmediatamente tirará.

    
respondido por el Karl Bielefeldt 17.02.2015 - 23:42
3

Tienes iteradores confundidos con generadores.

Su primer ejemplo es una expresión de iterador de lista, mientras que el segundo es una expresión de generador. La diferencia clave es que el generador crea cada miembro de la colección dada perezosamente (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 necesite la lista (o diccionario o lo que sea) para algo en sí mismo. Usaría un generador cuando la recolección sea incidental al producto final. Por ejemplo, puede usar un generador para obtener una lista de números que satisfagan algunos criterios de otros criterios. No te importa la lista original, solo los miembros que cumplen con los criterios. Por lo tanto, usas 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 defectuosos pobres y deformes, solo los triángulos exitosos fuertes y sanos. Así usaríamos un generador.

Este desbordamiento de pila publicación se detalla más.

    
respondido por el World Engineer 17.02.2015 - 22:36

Lea otras preguntas en las etiquetas