Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Python intermedio para IA, Unidad 8 — Iteradores, generadores y eficiencia, 8.2 — Generadores ·

Streaming de datos

Streaming de datos

Introducción

En el contexto del procesamiento y análisis de grandes volúmenes de datos, la capacidad de streaming (procesar datos a medida que se generan) es una herramienta vital. Los generadores en Python ofrecen un mecanismo eficiente para manejar flujos constantes de datos sin necesidad de cargar todo el conjunto de datos en memoria. Este enfoque es especialmente útil en aplicaciones donde los datos llegan continuamente y no se pueden almacenar en su totalidad debido a limitaciones de memoria.

Explicación principal con ejemplos

Concepto de Generadores

Un generador en Python es una función que contiene al menos una palabra clave yield. Cada vez que se llama a yield, el generador produce un valor y pausa su ejecución. Cuando se solicita más, el generador retoma desde donde quedó la última llamada a yield.

Un ejemplo básico de cómo crear y usar un generador es:

def simple_generator():
    for i in range(5):
        yield i

gen = simple_generator()
print(next(gen))  # Salida: 0
print(next(gen))  # Salida: 1

En este caso, simple_generator produce números del 0 al 4 uno por uno. Esto es muy útil para procesar conjuntos de datos grandes que no caben en la memoria.

Ejemplo práctico: Streaming CSV

Supongamos que queremos leer un archivo CSV de forma eficiente:

def csv_streamer(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            yield line.strip()

for row in csv_streamer('data.csv'):
    print(row)

En este ejemplo, csv_streamer es un generador que lee el archivo CSV línea por línea. Esto evita cargar todo el contenido del archivo en memoria a la vez.

Errores típicos / trampas

  1. No inicializar correctamente:

No olvides inicializar las variables antes de usarlas dentro del generador. Si no lo haces, podrías obtener valores inesperados o errores.

  1. Excepciones y manejo de errores:

Los generadores pueden generar excepciones si se produce un error durante su ejecución. Sin embargo, si no se manejan adecuadamente, esto puede hacer que el flujo del programa sea inesperado.

  1. No utilizar yield from correctamente:

Si tienes subgeneradores y deseas combinarlos en uno solo, asegúrate de usar yield from. No confundir con yield.

def nested_generator():
    for i in range(5):
        yield i

def outer_generator():
    for item in nested_generator():
        if item > 2:
            yield f"Filtered: {item}"

# Uso incorrecto sin yield from
for value in outer_generator():
    print(value)

# Uso correcto con yield from
def outer_generator_correct():
    for item in nested_generator():
        if item > 2:
            yield from [f"Filtered: {item}"]

for value in outer_generator_correct():
    print(value)

Checklist accionable

  1. Comprende los conceptos básicos de generadores.
  2. Practica la creación y uso de generadores en proyectos pequeños.
  3. Asegúrate de manejar correctamente las excepciones dentro del generador.
  4. Utiliza yield from cuando necesites combinar múltiples generadores.
  5. Implementa un flujo de trabajo de streaming básico para procesar archivos grandes.

Siguientes pasos

  • Aprende a optimizar el uso de memoria en Python.
  • Explora la implementación avanzada de iteradores y cómo pueden mejorar la eficiencia del código.
  • Experimenta con el manejo de excepciones en generadores para evitar fallos silenciosos.

La capacidad de procesar datos a medida que se genera, sin cargar todo en memoria, es una habilidad valiosa para cualquier programador trabajando en el campo de la inteligencia artificial y ciencias de datos. Los generadores son un componente fundamental en esta tarea y merece la pena aprender a usarlos correctamente.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).