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.
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.
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))--- Using Generator Function ---
0
1
1
2
3
--- Using Generator Expression ---
1
4
9Implementació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
Aprenda a utilizar bucles de Python para iterar sobre datos. Domine los bucles for, while, rompa, continúe y realice bucles con ejemplos interactivos.
Comprensiones de PythonEscribe Python más limpio y rápido. Lista maestra, diccionario y conjuntos por comprensión con ejemplos prácticos, condiciones de filtrado y bucles anidados.
Python ItertoolsAprenda el módulo itertools de Python. Domine infinitos iteradores, combinaciones, permutaciones, agrupaciones y procesamiento de datos con uso eficiente de la memoria.
Recursos recomendados de Python
Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.
Cómo utilizar generadores en Python
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.
Hoja de trucos sobre métodos de cadenas de Python
Una guía de referencia completa para la manipulación de cadenas de Python. Domine el formateo, la búsqueda, la división, el reemplazo y la verificación de las propiedades de las cadenas.
Python vs JavaScript: ¿Qué lenguaje de programación es mejor?
Una comparación completa entre Python y JavaScript. Explore las diferencias de sintaxis, el rendimiento, los casos de uso (backend frente a frontend) y ejemplos de codificación.