· 3 min de lectura · 426 palabras
Extensiones nativas en Rust, Cython y Zig para Python
Introducción
Python es lento para ciertas tareas. Es un hecho. Pero no tienes que resignarte: puedes escribir extensiones nativas en Rust, Cython o Zig y llamarlas desde Python como si fueran módulos normales.
La diferencia de rendimiento puede ser de 10x a 100x en código numérico intensivo.
Rust con PyO3
PyO3 permite escribir extensiones Python en Rust con una sintaxis limpia.
// Cargo.toml
// [lib]
// name = "mi_extension"
// crate-type = ["cdylib"]
//
// [dependencies]
// pyo3 = { version = "0.21", features = ["extension-module"] }
use pyo3::prelude::*;
#[pyfunction]
fn fibonacci(n: u64) -> u64 {
match n {
0 | 1 => n,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
#[pymodule]
fn mi_extension(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(fibonacci, m)?)?;
Ok(())
}
# Build con maturin
pip install maturin
maturin develop # build e instalar en el entorno actual
# Uso desde Python
from mi_extension import fibonacci
print(fibonacci(40)) # ~0.2s vs ~30s en Python puro
Cython
Cython compila Python a C.
# fib.pyx
def fibonacci(int n):
cdef int i
cdef long long a = 0, b = 1, temp
if n == 0:
return 0
for i in range(2, n + 1):
temp = a + b
a = b
b = temp
return b
# setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("fib.pyx"))
# Uso
from fib import fibonacci
print(fibonacci(40))
Zig
Zig es un lenguaje moderno que puede compilar a bibliotecas C compatibles con Python.
// fib.zig
export fn fibonacci(n: u64) u64 {
if (n <= 1) return n;
var a: u64 = 0;
var b: u64 = 1;
for (0..n-1) |_| {
const temp = a + b;
a = b;
b = temp;
}
return b;
}
zig build-lib fib.zig -dynamic
import ctypes
lib = ctypes.CDLL("./libfib.so")
lib.fibonacci.restype = ctypes.c_uint64
print(lib.fibonacci(40))
¿Cuándo usar cuál?
| Criterio | Rust/PyO3 | Cython | Zig/ctypes |
|---|---|---|---|
| Curva de aprendizaje | Media-Alta | Baja | Alta |
| Rendimiento | Excelente | Muy bueno | Excelente |
| Seguridad de memoria | Garantizada | Manual | Manual |
| Ecosistema | PyO3 maduro | Maduro | Básico |
| Debugging | Bueno | Complejo | Bueno |
Conclusión
Las tres opciones funcionan. Mi recomendación:
- PyO3 para extensiones nuevas (seguridad de memoria, ecosistema activo)
- Cython para acelerar código Python existente (mínimo cambio)
- Zig para proyectos donde ya usas Zig o necesitas control total