Python se usa mucho en IA, análisis de datos y otros campos, y tiene la ventaja de permitir programar rápido, pero en trabajo real también suele causar dolores de cabeza por el problema crónico de rendimiento de los lenguajes interpretados.
En la práctica, para mejorar los problemas de velocidad de Python se consideran varias alternativas. A veces el código Python se usa solo como prototipo inicial y, al pasar a production, se vuelve a desarrollar en Rust o C/C++.
Estoy desarrollando de forma experimental una nueva alternativa llamada Rextio para resolver los problemas de rendimiento sin abandonar Python.
La idea básica es tomar las partes del código Python que pueden convertirse a nativo (como código estático con type hints), transformarlas automáticamente a código Rust y compilarlas como binario para mejorar el rendimiento, mientras que las partes difíciles de convertir automáticamente a nativo (como el código dinámico) se dejan tal cual como código Python para ejecutarse en CPython como fallback, preservando así la lógica del código Python original.
A grandes rasgos, funciona así.
Proyecto Python con tipos especificados
-> análisis de candidatos nativos compatibles
-> rechazo de funciones inseguras o no compatibles
-> las funciones aceptadas generan Rust + PyO3
-> el resto genera wrappers Python de fallback
-> compilación de artifacts compatibles con import
Para más detalles, revisen la documentación en el Git repository enlazado.
Al comparar la ejecución con el binario nativo convertido por Rextio frente a la ejecución del código Python original en CPython, también se puede comprobar una mejora de rendimiento.
- Al convertir y ejecutar código Python básico como nativo: 57.73×
- Al convertir y ejecutar NumPy como nativo: 2.52×
- Al convertir NetworkX a nativo y ejecutar el algoritmo de Dijkstra: 3.68×
- Al convertir
Series.mapde pandas a nativo y ejecutarlo: 66.14× - Al convertir un deep MLP de PyTorch a nativo y ejecutarlo: 1.02× (la mejora es limitada porque el paquete Python original ya usa extensiones en C, etc.)
- Al convertir una eager chain de TensorFlow a nativo y ejecutarla: 1.04× (la mejora es limitada porque el paquete Python original ya usa extensiones en C, etc.)
Para el código fuente usado en esos benchmarks y la información del entorno de ejecución, consulten el Git repository rextio-benchmark.
Como referencia, Rextio incluye un Core CLI que convierte código Python y ejecuta la compilación, y además está siendo desarrollado para permitir añadir plugins adicionales que definan reglas para convertir paquetes Python individuales a código Rust. Actualmente ya existen algunos plugins, como los de NumPy (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow, etc.), y los resultados de benchmark anteriores se obtuvieron usando esos plugins.
Por supuesto, Rextio sigue siendo un proyecto inicial con mucho por mejorar, y compilar código Python como nativo basado en Rust no siempre aporta una mejora de rendimiento en todos los casos.
Por ejemplo, si hay intercambio frecuente de datos entre la parte nativa y la parte de fallback en CPython, el cruce de fronteras con conversión de datos puede incluso provocar una caída de rendimiento. Aun así, en Rextio se intenta evitar esa degradación haciendo que, en esos casos, esa parte pase por completo a fallback en CPython sin pasar por la ruta nativa.
Hasta ahora lo venía desarrollando por mi cuenta, pero como siento que ya tomó cierta forma, quería presentarlo aquí.
Si tienen preguntas, opiniones o feedback, haré lo posible por responder y reflejarlo.
Gracias.
Aún no hay comentarios.