Polars 2.0 promete ser 5 veces más rápido... ¿Qué ha cambiado?

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

스크립트

00:00:00El mayor competidor de Pandas está a punto de lanzar su versión 2.0.
00:00:04La actualización de Polars casi está aquí, y el cambio más grande probablemente no sea el que esperas.
00:00:09Por defecto, todas las consultas que ya has escrito se ejecutarán en un motor diferente.
00:00:14Sin cambiar ni una sola línea.
00:00:15Polars también deja de garantizar que las filas se devuelvan en el orden de entrada.
00:00:19Parece un retroceso, aunque no lo es; es el precio para hacer posible el primer cambio.
00:00:24A medida que Polars gana terreno con la 2.0, le está haciendo una seria competencia a Pandas.
00:00:30Echemos un vistazo a su actualización más importante hasta la fecha.
00:00:37Bien, desde el principio de los tiempos, Pandas siempre ha sido la opción preferida para el trabajo de datos.
00:00:43Es sencillo, lo usa muchísima gente y no solo va genial para analítica de datos, sino que también es clave en aprendizaje automático.
00:00:49Luego, hace un tiempo, llegó Polars.
00:00:51Siempre ha sido más rápido que Pandas.
00:00:53Ya hablaremos de eso.
00:00:54Ahora, con esta gran actualización 2.0, puede que esté más cerca de una adopción masiva.
00:01:00Para un poco de contexto, Polars ha tenido discretamente dos motores desde hace tiempo.
00:01:05El que la mayoría de la gente ha estado usando es el motor en memoria.
00:01:08Puedes imaginarlo como un almacén.
00:01:10Carga todo tu conjunto de datos en el suelo del almacén y luego ejecuta cada paso de la consulta por todo el espacio.
00:01:17Y eso es extremadamente rápido.
00:01:19Siempre que todo quepa en la memoria RAM.
00:01:21El motor de transmisión (streaming) funciona de manera diferente.
00:01:23En lugar de un espacio gigante, es más bien como una cadena de montaje.
00:01:27Polars divide los datos en trozos pequeños que los desarrolladores llaman “morsels”.
00:01:32Esos trozos están dimensionados para caber en la caché de tu CPU.
00:01:36Luego se procesan a través del plan de consulta.
00:01:39Así, diferentes partes de la consulta avanzan en lugar de esperar a todo el conjunto de datos.
00:01:43De ahí viene la velocidad.
00:01:44Y con el tiempo, también es el camino para trabajar con datos que superan la memoria RAM.
00:01:49Pero hay un truco.
00:01:50Si tienes ocho trabajadores en una cadena de montaje, no necesariamente terminan en el mismo orden en que empezaron.
00:01:56Y Polars tampoco.
00:01:58Así que en la 2.0, los joins, group bys, unpivots y, literalmente como dice la documentación, etc.
00:02:04Ya no garantizan el orden de las filas.
00:02:06A menos que lo pidas explícitamente.
00:02:08Si te gusta programar herramientas para agilizar tu trabajo, no olvides suscribirte.
00:02:11Publicamos vídeos continuamente.
00:02:13Bien, así es como se ve esto en la práctica.
00:02:15Voy a hacer `uv pip install --pre polars`.
00:02:18Y recuerda ese parámetro `--pre`.
00:02:20Volveremos a eso en un segundo.
00:02:22Vale.
00:02:22Tengo un LazyFrame con las claves 2, 1, 0.
00:02:27Le hago un `left join` con otro frame y luego ejecuto `collect`.
00:02:32Mira el resultado.
00:02:34Es el mismo código que en Polars 1.
00:02:35El orden ya no está garantizado.
00:02:37Es el mismo código, pero se comporta diferente.
00:02:39Ahora añado `maintain_order="left"` al join.
00:02:43Lo ejecuto de nuevo.
00:02:44Lo corro otra vez aquí.
00:02:45Y el orden original está de vuelta.
00:02:47Esto no significa que Polars esté mezclando los datos al azar.
00:02:51Es Polars diciendo: si el orden importa, indícalo.
00:02:54Tienes que indicárselo explícitamente.
00:02:56Y hay otro detalle interesante aquí.
00:02:58Ejecuta la función `explain` en una consulta.
00:03:01No oculta este comportamiento.
00:03:03Solo tienes que saber dónde buscar.
00:03:05Ese es el gran cambio de comportamiento.
00:03:06Pero la 2.0 es curiosa porque no es realmente una versión llena de funciones nuevas.
00:03:10En realidad es solo una limpieza.
00:03:12Y se está limpiando una cantidad considerable de cosas.
00:03:15El `read_csv` estilo Pandas ahora es solo `scan_csv` con un `collect` por debajo.
00:03:22El perfilado de LazyFrame ha desaparecido.
00:03:25`melt` pasa a ser `unpivot`.
00:03:28`join_nulls` pasa a ser `nulls_equal`.
00:03:30Se ha eliminado la conversión directa de entero a categórico.
00:03:35Ahora puedes usar `cat2` para solucionar esto.
00:03:38Se ha eliminado la conversión directa de cadena de texto a fecha.
00:03:41Eso es `str` a `date`.
00:03:43Al sumar un entero con signo y uno sin signo de 64 bits, Polars te devuelve un `int128` en vez de convertirlo a `float` y perder precisión en silencio.
00:03:53Y aún hay más cambios.
00:03:55Por ejemplo, al usar `concat`.
00:03:57Ahora rechaza las alturas no coincidentes en lugar de intentar adivinar lo que querías hacer.
00:04:02Esta es una decisión bastante acertada por parte de Polars.
00:04:05Cada elemento eliminado lanza un error `AttributeRemovedError`.
00:04:09Eso te dice exactamente por qué se ha reemplazado.
00:04:12Llamas a `melt` y el error te dice literalmente que uses `unpivot` con `index` y `on`.
00:04:17Todos estos errores se convierten prácticamente en una guía de uso.
00:04:20Ejecutas el código, algo se rompe, corriges ese fallo basándote en el error y sigues adelante.
00:04:26Y eso nos lleva a la razón por la que Polars se ha vuelto imprescindible para muchos.
00:04:31Pandas traslada muchos de sus problemas al tiempo de ejecución.
00:04:35Polars intenta detectarlos pronto con todo esto.
00:04:37Puedes llamar a `collect_schema` y descubrir que los tipos son incorrectos antes de que Polars lea una sola fila.
00:04:44Simplemente se anticipa a lo que va a ocurrir.
00:04:47Y se está volviendo cada vez más eficiente.
00:04:48Entonces, ¿dónde encaja exactamente Polars?
00:04:50Bueno, DuckDB está centrado en SQL.
00:04:53Polars es una API de expresiones diseñada para Python.
00:04:56También están Dask y Spark.
00:04:58Esos son distribuidos.
00:04:59Polars se enfoca en una sola máquina.
00:05:01La librería en sí es de código abierto.
00:05:04Polars Cloud no lo es.
00:05:05Y ese detalle clave cambia las cosas cuando hablamos de rendimiento.
00:05:09Este anuncio dice que el nuevo motor de transmisión es fácilmente cinco veces más rápido.
00:05:13He probado Polars a lo largo de los años y sí, es más rápido que Pandas, pero nunca he obtenido velocidades locas como cinco veces más rápido.
00:05:21Pruébalo con conjuntos de datos más grandes.
00:05:23Sin duda notarás la diferencia de velocidad.
00:05:25Variará en cada ejecución y con cada dataset, pero vas a sentir la diferencia y a verla en el tiempo de ejecución.
00:05:30Y esta es probablemente la distinción más importante de todo el lanzamiento.
00:05:34La parte que permitiría al motor volcar datos a disco, una verdadera ejecución fuera de memoria (out-of-core), aún no ha llegado.
00:05:40Así que hoy, “streaming” significa procesamiento en bloques y canalizado.
00:05:43Aún no significa que tu conjunto de datos pueda ser mágicamente mayor que la RAM.
00:05:46Ese multiplicador de 5x es la propia expectativa de Polars.
00:05:50No hay ninguna tabla de benchmarks en la publicación.
00:05:53Y sinceramente, a la mayoría de la gente parece parecerle bien.
00:05:55A muchos usuarios les alegró ver una versión útil aunque aburrida.
00:05:59No hay un montón de funciones nuevas.
00:06:01No tienes que aprender nada nuevo.
00:06:02Esos errores, mientras codificas, te irán diciendo por qué reemplazar cada cosa.
00:06:07Solo cambios disruptivos, limpieza y el versionado semántico usado como debe ser.
00:06:12Pero hay dos quejas que se repiten una y otra vez.
00:06:14La primera es el orden de las filas.
00:06:15Si `maintain_order` es `False` por defecto, puedes generar errores muy molestos en el código.
00:06:19Porque nada falla explícitamente.
00:06:21Tus números pueden seguir siendo totalmente correctos.
00:06:23Solo que están asignados a las filas en un orden diferente.
00:06:26Eso es mucho más difícil de notar que una excepción.
00:06:29La segunda queja fue el uso de la palabra “streaming” aquí.
00:06:32Muchos argumentan que es confuso para un motor que todavía no es verdaderamente out-of-core.
00:06:38Además, hay errores propios de la versión de prueba (release candidate).
00:06:41Desde que salió la RC, ha habido un problema de prioridad alta donde
00:06:44`group_by_dynamic` lanza un error de fecha fuera de rango en el motor de streaming.
00:06:49Llamas al método `limit`.
00:06:51Y bueno, `limit` no sale antes de tiempo después de un join.
00:06:54Y la conversión de cadena a fecha y hora puede devolver nulo en lugar de lanzar un error como antes.
00:06:58Por eso te dije que recordaras el comando de instalación con `--pre`.
00:07:02Previo a la 2.0.
00:07:04Esta sigue siendo una versión preliminar.
00:07:06Y de momento, se comporta como tal.
00:07:08Lo cual está bien.
00:07:09¿Verdad?
00:07:09Aún no es la versión definitiva.
00:07:11Una cosa más.
00:07:12La crate de Rust sigue en la versión 0.55.
00:07:15Así que si usas Polars desde Rust, aún no hay Polars 2.0 para ti.
00:07:19Pero voy a asumir que la mayoría de nosotros aquí simplemente usaremos Python.
00:07:24Ahora bien, ¿deberías actualizar?
00:07:25Bueno, para un proyecto nuevo, sí, yo lo haría.
00:07:27¿No?
00:07:27Nos adaptamos a las nuevas tecnologías y actualizaciones.
00:07:30Si tu pipeline ya utiliza `sink_parquet` o `sink_csv`, en la práctica has estado usando
00:07:34streaming todo este tiempo de todas formas.
00:07:36Pero hay algunos casos de uso en los que yo esperaría.
00:07:39¿Vale?
00:07:39Si tu código depende del orden de las filas, no actualices esperando que todo salga bien.
00:07:43Haz una búsqueda de los `group_by` que no tengan un ordenamiento posterior.
00:07:47Si estás usando `group_by_dynamic`, yo esperaría a que todo esto se estabilice.
00:07:51Y la verdad, es genial ver hacia dónde va a ir esto probablemente.
00:07:54Esta será probablemente la 2.0, pero aún no es la versión oficial.
00:07:57Puedes ir familiarizándote con ella, pero no está del todo lista.
00:08:00Lo que no dejo de pensar es lo poco habitual que se siente este lanzamiento.
00:08:03Polars 2.0 no incluye ninguna función nueva.
00:08:07Y aun así altera el comportamiento de tu código actual.
00:08:10El nuevo motor es más rápido en mi ordenador, solo que no cinco veces más rápido.
00:08:14Así que la 2.0 no es emocionante por añadir un montón de novedades.
00:08:18Es emocionante porque Polars aprovecha un salto de versión principal para limpiar a fondo la base
00:08:24de todo lo que ya estamos utilizando.
00:08:26Soy Josh de BetterStack.
00:08:28Si te gustan estos consejos y trucos de programación, no olvides suscribirte.
00:08:30Nos vemos en el próximo vídeo.

핵심 요약

Polars 2.0 cambia su motor por defecto a procesamiento en flujo y elimina la garantía de orden de filas para ganar velocidad, priorizando una depuración estricta de la API sobre la adición de nuevas funciones.

하이라이트

  • Polars 2.0 activa por defecto un motor de procesamiento en flujo (streaming) que divide los datos en trozos pequeños llamados “morsels” adaptados a la caché de la CPU.

  • Las operaciones como joins, group bys y unpivots ya no garantizan el orden original de las filas a menos que se especifique el parámetro `maintain_order`.

  • Los elementos obsoletos eliminados devuelven un error `AttributeRemovedError` con instrucciones explícitas sobre la función sustituta.

  • La suma de enteros con y sin signo de 64 bits genera un tipo `int128` para evitar la pérdida de precisión al convertir a flotantes.

  • El motor de transmisión actual procesa datos por bloques canalizados, pero todavía no permite ejecutar consultas sobre conjuntos de datos que superan la memoria RAM (out-of-core).

타임라인

Cambio de motor por defecto y pérdida de orden sintáctico

  • El motor en memoria tradicional procesa consultas cargando todo el conjunto de datos en la memoria RAM.
  • El motor de transmisión divide las consultas en bloques denominados morsels dimensionados para la caché del procesador.
  • La ejecución en paralelo del motor de transmisión elimina la garantía implícita sobre el orden de salida de las filas.

Polars pasa de un esquema basado en memoria completa a una arquitectura dividida en bloques procesados en paralelo. La distribución del trabajo entre múltiples núcleos causa que las operaciones terminen en tiempos variables. Para mantener la secuencia original de entrada en operaciones de combinación o agrupación, la consulta requiere declarar parámetros como `maintain_order="left"` de forma explícita.

Depuración de la API y manejo de errores explicativos

  • Las funciones `melt`, `read_csv` y `join_nulls` se reemplazan por `unpivot`, `scan_csv` y `nulls_equal` respectivamente.
  • El método `concat` rechaza DataFrames con números de filas no coincidentes sin intentar alineaciones automáticas.
  • Los métodos eliminados activan una excepción `AttributeRemovedError` con las instrucciones exactas de reemplazo.

La versión 2.0 centra su diseño en eliminar comportamientos ambiguos e implícitos. La conversión directa entre cadenas y fechas o de enteros a categóricos queda deshabilitada. Cuando el código invoca un método extinto, la excepción emitida detalla las funciones y argumentos requeridos para corregir el fallo directamente en el entorno de desarrollo.

Validación de tipos anticipada y arquitectura de ejecución

  • El método `collect_schema` valida la compatibilidad de los tipos de datos antes de iniciar la lectura del archivo.
  • Polars funciona como una librería para una sola máquina, a diferencia de sistemas distribuidos como Spark o Dask.
  • El término streaming en la versión 2.0 describe ejecución por bloques y no volcado de datos a disco out-of-core.

Frente a Pandas, que detecta inconsistencias en tiempo de ejecución tras procesar los datos, Polars inspecciona la estructura de las columnas antes de ejecutar la consulta. El nuevo motor incrementa el rendimiento en conjuntos de datos voluminosos mediante canalización, aunque las consultas aún dependen de la capacidad total de la memoria RAM del sistema.

Errores detectados en la versión preliminar y recomendaciones de migración

  • Consultas que asumen orden implícito en las filas pueden generar resultados incorrectos sin lanzar excepciones.
  • La versión candidata actual presenta un fallo prioritario en `group_by_dynamic` con errores de fechas fuera de rango.
  • La librería de Rust permanece en la versión 0.55 mientras se prueba la versión preliminar de Python.

La falta de orden predeterminado representa un riesgo en canalizaciones donde las asignaciones de filas dependen de la posición. Métodos como `limit` presentan fallos al salir antes de tiempo tras un join en la versión candidata. Se recomienda posponer la actualización en proyectos existentes que dependan de agrupaciones temporales o secuencias estrictas hasta la salida de la versión estable.

커뮤니티 글

아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!

이 영상에 대해 글쓰기