Generadores de Python: iteradores con memoria eficiente

Aprenda a utilizar generadores de Python y declaraciones de rendimiento para procesar conjuntos de datos enormes con un uso mínimo de memoria. Expresiones generadoras maestras.

Pruébelo en el editor

Descripción general

Al escribir código que procesa miles o millones de registros, la gestión de la memoria se vuelve fundamental. Si carga un conjunto de datos completo en una lista, corre el riesgo de quedarse sin RAM y colapsar el servidor. Los generadores de Python resuelven este problema proporcionando un mecanismo para transmitir datos bajo demanda. En lugar de calcular y almacenar todo el conjunto de datos en la memoria a la vez, un generador produce un elemento a la vez, se lo entrega a la persona que llama y pausa su ejecución hasta que se solicita el siguiente elemento.

Los generadores se definen como funciones normales, pero usan la palabra clave "rendimiento" en lugar de "retorno". Cuando se llama a una función generadora, devuelve un objeto iterador generador sin ejecutar las declaraciones internas de la función. Cuando la persona que llama llama a `next()` en el generador (o lo recorre), la función se ejecuta hasta que alcanza `yield`. En ese punto, el generador genera el valor, guarda sus variables locales y suspende la ejecución. Cuando se vuelve a llamar, continúa exactamente donde lo dejó.

También puede crear generadores usando expresiones generadoras, que usan una sintaxis idéntica a las listas por comprensión pero entre paréntesis `(...)` en lugar de corchetes `[...]`. Esto hace que sea increíblemente fácil reemplazar las listas por comprensión con iteradores que ahorran memoria. Al evitar asignaciones masivas de memoria, los generadores son indispensables para trabajar con registros grandes, transmitir datos desde bases de datos o realizar cálculos en secuencias matemáticas de longitud infinita.

Código y salida de ejecución

Un generador personalizado que genera números de Fibonacci y una expresión generadora con uso eficiente de la memoria.

generators_demo.py
Pruébelo en el editor
def fibonacci_generator(limit):
    """Yields Fibonacci numbers up to the limit."""
    a, b = 0, 1
    count = 0
    while count < limit:
        yield a
        a, b = b, a + b
        count += 1

# Instantiate generator
fib = fibonacci_generator(5)
print("--- Using Generator Function ---")
for num in fib:
    print(num)

# Generator expression (squares of numbers)
squares_gen = (x**2 for x in range(1, 1000000))
print("\n--- Using Generator Expression ---")
print(next(squares_gen))
print(next(squares_gen))
print(next(squares_gen))
Salida terminal
--- Using Generator Function ---
0
1
1
2
3

--- Using Generator Expression ---
1
4
9

Implementación paso a paso

  • Leer archivos línea por línea que son demasiado grandes para la RAM
  • Generar una secuencia infinita de identificaciones o cifras matemáticas.
  • Transmisión de registros de bases de datos en lotes para procesar llamadas API

Preguntas frecuentes

¿Cuál es la diferencia entre rendimiento y rentabilidad?

return finaliza la función por completo. rendimiento produce un valor y pausa la función, guardando su estado para que pueda reanudarse cuando se solicite.

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

Genera una excepción StopIteration. Bajo un bucle 'for', Python intercepta automáticamente esta excepción para finalizar el bucle limpiamente.

Temas relacionados

Recursos recomendados de Python

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