· 3 min de lectura · Por Grover Cordova
Cómo migrar de Python a Rust sin reescribir tu aplicación
Mantén Python donde aporta y lleva a Rust solo el código que limita tu rendimiento, usando PyO3 y maturin.
No necesitas elegir entre Python y Rust. Casi siempre conviene usar los dos: Python para orquestar y Rust para las pocas rutas donde se concentra el costo.
Herramientas como Polars, Ruff y uv siguen esta idea: se usan desde el ecosistema de Python, con un núcleo escrito en Rust.
1. Mide antes de migrar
Rust no arregla un problema que no has localizado. Perfila tu aplicación con carga real, usando una herramienta como py-spy, y busca funciones de CPU que dominen el tiempo total.
Si el tiempo se va esperando a la base de datos o a la red, Rust no ayudará mucho. Corrige primero las consultas, los índices o la arquitectura.
2. Elige una función pequeña y pura
El mejor primer candidato tiene tres rasgos:
- Consume mucha CPU.
- Tiene entradas y salidas simples.
- Tiene pruebas, o es fácil escribírselas.
Parsers, validadores, transformaciones de datos y cálculos numéricos suelen encajar bien.
3. Exponla como un módulo de Python
PyO3 permite escribir extensiones nativas, y maturin las empaqueta. Desde Python, se importa como cualquier otro módulo:
use pyo3::prelude::*;
#[pyfunction]
fn total_centavos(montos: Vec<i64>) -> i64 {
montos.iter().sum()
}
#[pymodule]
fn nucleo(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(total_centavos, m)?)?;
Ok(())
}
import nucleo
nucleo.total_centavos([1250, 800, 4300])
Cruzar la frontera entre Python y Rust también cuesta tiempo, porque se convierten datos. Por eso es mejor pasar lotes de trabajo que llamar a Rust una vez por cada elemento en un bucle.
4. Verifica la equivalencia
Ejecuta la versión antigua y la nueva con las mismas entradas y compara los resultados. En producción, puedes correr ambas en paralelo durante un tiempo y usar solo la antigua para responder, hasta tener confianza.
5. Decide si seguir
Compara el resultado con la métrica que definiste al inicio. Si la mejora justifica el costo, pasa al siguiente componente. Si no, detente: una migración parcial que resuelve el problema ya es un buen resultado.