Cómo utilizar generadores en Python (declaración de rendimiento)

Aprenda a escribir generadores en Python. Comprenda la palabra clave de rendimiento, la evaluación diferida, la optimización de la memoria y compare generadores con estructuras de listas.

Pruebe esta solución en el Editor

Descripción general

Cuando se trabaja con conjuntos de datos masivos, archivos de registro o flujos de datos infinitos, cargar todos los elementos en la memoria simultáneamente (como devolver una lista grande) puede agotar fácilmente la RAM del sistema y bloquear la aplicación. Python ofrece una solución brillante y eficiente en memoria: Generadores.

Un generador es un tipo especial de función que devuelve un iterador diferido. En lugar de calcular todos los valores a la vez y devolverlos, un generador genera valores uno por uno según lo solicitado. La diferencia clave es la declaración de "rendimiento". Cuando una función generadora llama a "rendimiento", pausa su estado de ejecución (variables, puntero de instrucción) y devuelve el valor obtenido. Cuando se solicita el siguiente valor, la función se reanuda exactamente donde se detuvo.

Debido a que los cálculos del generador se ejecutan de manera perezosa, utilizan casi cero memoria, independientemente del tamaño del conjunto de datos. Python también admite expresiones generadoras, que utilizan la sintaxis entre paréntesis `(x para x en datos)` para crear generadores en línea livianos sin declarar funciones completas.

Código y salida de ejecución

Este script demuestra la generación de secuencias utilizando funciones generadoras con la declaración de rendimiento y las expresiones generadoras.

generators_demo.py
Pruébelo en el editor
# 1. Generator function using yield
def count_up_to(limit):
    count = 1
    while count <= limit:
        yield count
        count += 1

# Instantiating the generator
counter = count_up_to(3)
print("Memory safe generator instantiated.")

# Fetching values manually
print("Next 1:", next(counter))
print("Next 2:", next(counter))
print("Next 3:", next(counter))

# 2. Iterating with a for loop (automatically handles StopIteration)
print("\n--- Looping over generator ---")
for num in count_up_to(4):
    print("Num:", num)

# 3. Generator expression (Shorthand syntax)
squares_gen = (x**2 for x in range(1, 4))
print("\nGenerator expression elements:")
print(list(squares_gen)) # Cast to list to print all elements
Salida terminal
Memory safe generator instantiated.
Next 1: 1
Next 2: 2
Next 3: 3

--- Looping over generator ---
Num: 1
Num: 2
Num: 3
Num: 4

Generator expression elements:
[1, 4, 9]

Implementación paso a paso

  • Defina una función utilizando la palabra clave def estándar.
  • Utilice la palabra clave de rendimiento en lugar de volver para devolver los valores al flujo del iterador.
  • Itere sobre el generador usando un bucle for o llame a la función next(gen) incorporada para extraer valores.
  • Utilice expresiones generadoras (usando paréntesis) para conversiones diferidas simples y en línea.

Preguntas frecuentes

¿Cuál es la principal ventaja de los generadores sobre las listas?

Eficiencia de la memoria. Las listas almacenan todos los elementos en la RAM simultáneamente, mientras que los generadores generan elementos uno por uno según demanda, lo que le permite procesar conjuntos de datos que son más grandes que la memoria total de su sistema.

¿Qué sucede cuando un generador se queda sin elementos?

Python genera una excepción StopIteration. Un bucle for detecta esta excepción automáticamente para salir del bucle con gracia, pero llamar manualmente a next() en un generador agotado arrojará la excepción.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.