○ planned · proyecto

Otorga nivel a: Python · compilation

Usa: Python · NumPy · compilation · static typing · type checking

Charla práctica sobre por qué Rust (confiabilidad, memory safety sin recolector de basura, sin condiciones de carrera) y cómo integrarlo con Python usando PyO3 y la herramienta de empaquetado uv. La tesis central es la filosofía de PyO3: no reescribir tu programa de Python, sino complementarlo con Rust en los módulos que son lentos o difíciles de mantener. Incluye un demo en vivo construyendo un paquete híbrido y consumiéndolo desde Python.

Hallazgos clave

  • Reemplazar una función de Python por su equivalente en Rust con PyO3 da entre 2x y 4x de aceleración “gratis” (free lunch) sin tocar el resto del código, según la prueba con un contador de ocurrencias de palabras.
  • La macro procedural de PyO3 funciona como un decorador de Python: expande la función de Rust para que exponga la API de C y pueda ser consumida como módulo; el desarrollador nunca manipula el binario manualmente.
  • El error más común en el demo fue olvidar registrar la función en el módulo (m.add_function(wrap_pyfunction!(count, m)?)) — definías la función en Rust pero nunca la exponías a Python, y el mensaje de error “never used” guió la corrección.
  • Si defines estructuras/clases personalizadas en Rust para consumirlas en Python, compiten por el GIL (Global Interpreter Lock) de Python, por lo que no eliminas del todo los problemas de concurrencia; en cambio, pasar arreglos NumPy a Rust para procesamiento paralelo sí es directo.

Módulos

  1. Por qué Rust: confiabilidad y memory safety — Result/Pattern Matching (sin excepciones), ownership, borrowing, lifetimes y el Borrow Checker frente al recolector de basura.
  2. Cómo funciona PyO3: macros y el ABI de C — macros declarativas vs procedurales, cómo se genera el binario (.so/.pyd) y su analogía con Cython (.pyx).
  3. Herramientas: Maturin, cargo, rust-numpy y uv — uv como empaquetador escrito en Rust (más rápido que Poetry), build backend de maturin y la estructura Cargo.toml/pyproject.toml/lib.rs.
  4. Construyendo un paquete híbrido end-to-enduv init, agregar funciones en Rust, registrarlas en el módulo, compilar el wheel e instalarlo en un ambiente virtual.
  5. Patrones de interoperabilidad de datos — pasar tipos simples, arreglos NumPy, DataFrames (pandas/Polars) y el problema del GIL con clases personalizadas; Rust→Python vs Python→Rust.
  6. Portabilidad y distribución — por qué el binario es específico a OS y arquitectura, y cómo compilar/empaquetar para cada plataforma (wheel).

Fuente: https://www.youtube.com/watch?v=HnRJvIpApbg · Transcript local: data/cursos/datapub-rust-python-pyo3/rust-python-pyo3.srt

Enlaces

Otorga nivel a: Python · compilation Usa: Python · NumPy · compilation · static typing · type checking