Saltar a contenido

Lazy Mode

Banner del Curso

Introducci贸n

Polars ofrece dos modos de ejecuci贸n: eager (inmediato) y lazy (evaluaci贸n diferida). Mientras que en el modo eager cada operaci贸n se ejecuta inmediatamente, en el modo lazy las operaciones se registran y se ejecutan solo cuando es necesario, permitiendo aplicar optimizaciones autom谩ticas.

Este enfoque es similar al que usan motores como Apache Spark y permite obtener mejores tiempos de ejecuci贸n y menor consumo de memoria, especialmente en pipelines complejos.


驴Qu茅 es el modo lazy?

El modo lazy permite construir un plan de ejecuci贸n completo que luego es optimizado por Polars antes de ejecutarse. Esto incluye:

  • Eliminaci贸n de pasos innecesarios.
  • Reordenamiento de operaciones para mejorar eficiencia.
  • Ejecuci贸n en paralelo en m煤ltiples n煤cleos.

Es ideal cuando necesitas encadenar m煤ltiples transformaciones, leer archivos grandes o automatizar procesos de preprocesamiento.


Crear un LazyFrame

import polars as pl

lf = pl.read_csv("data/ventas.csv").lazy()

Esto no ejecuta la lectura del archivo todav铆a. Solo crea un objeto LazyFrame que contiene el plan.


Encadenar transformaciones

lf = (
    pl.read_csv("data/ventas.csv").lazy()
    .filter(pl.col("monto") > 1000)
    .with_columns([
        (pl.col("monto") * 1.19).alias("monto_con_iva")
    ])
    .select(["cliente", "monto_con_iva"])
)

A煤n no se ha le铆do ni procesado el archivo. El plan se ejecuta cuando se llama a .collect():

df = lf.collect()

Visualizar el plan de ejecuci贸n

lf.explain()

Esto muestra el plan l贸gico que Polars construy贸. Es muy 煤til para entender c贸mo se optimiza el flujo.


Optimizaci贸n autom谩tica

El motor de Polars aplicar谩 optimizaciones como:

  • Proyecci贸n empujada: eliminar columnas innecesarias.
  • Filtrado empujado: aplicar filtros lo antes posible.
  • Combinaci贸n de pasos: agrupar operaciones para evitar materializaciones intermedias.

Estas optimizaciones son completamente autom谩ticas y no requieren intervenci贸n del usuario.


Comparaci贸n Eager vs Lazy

# Eager
df = pl.read_csv("data/ventas.csv")
df = df.filter(pl.col("monto") > 1000)
df = df.select(["cliente", "monto"])

# Lazy
lf = (
    pl.read_csv("data/ventas.csv").lazy()
    .filter(pl.col("monto") > 1000)
    .select(["cliente", "monto"])
)
df = lf.collect()

En modo eager, cada paso se ejecuta de inmediato. En modo lazy, se construye el pipeline completo antes de ejecutar.


Recomendaciones para usar Lazy

  • Lectura y transformaci贸n de archivos grandes (CSV, Parquet, etc.).
  • Preprocesamiento en pipelines de ML.
  • Proyectos en producci贸n donde la eficiencia es clave.
  • Validaci贸n o limpieza de datos en pasos encadenados.

Buenas pr谩cticas

  • Siempre finaliza con .collect() para materializar el resultado.
  • Usa .explain() si tienes dudas sobre la eficiencia de tu pipeline.
  • Mant茅n la l贸gica declarativa y evita operaciones fuera del pipeline.
  • Combina with_columns, select, filter, y groupby para expresar todo dentro del flujo lazy.

Referencias 煤tiles


Conclusi贸n

El modo lazy de Polars permite construir pipelines declarativos y eficientes, optimizados autom谩ticamente antes de ejecutarse. Esta caracter铆stica es especialmente valiosa al trabajar con grandes vol煤menes de datos o al desarrollar flujos de procesamiento reutilizables y escalables.

Dominar el modo lazy es clave para aprovechar todo el potencial de Polars como herramienta de ingenier铆a de datos de alto rendimiento.