Python y Rust ocupan extremos aparentemente opuestos del espectro del lenguaje. Python, interpretado en tiempo de ejecución, ofrece a los desarrolladores un entorno de programación flexible y cómodo, pero a costa de la velocidad bruta. Rust proporciona velocidad y garantías de seguridad de la memoria, pero requiere que aprendas un nuevo paradigma para manejar las operaciones de la memoria. En teoría, estos lenguajes no deberían competir; deberían cooperar. Y en la práctica, pueden hacerlo. Rust puede beneficiarse de la facilidad de uso de Python, y Python puede beneficiarse de la velocidad y seguridad de Rust. Si desea utilizar Rust con Python o Python con Rust, deberá tener al menos una familiaridad superficial con ambos lenguajes para obtener lo mejor. resultados. También deberá decidir cuál de los dos es su idioma principal, ya que las opciones para cada enfoque son significativamente diferentes. Llamar a Rust desde Python con PyO3 Si Python es su idioma principal, la integración con Rust funciona conceptualmente de la misma manera que la integración de Python. con C. La implementación predeterminada de Python, escrita en C, usa extensiones escritas en C o usando una ABI compatible con C. Las extensiones escritas en Rust que usan la misma ABI también funcionarán, aunque eso no es automático: debe usar cajas diseñadas para proporcionar enlaces para funciones de Rust a la API de Python C. Creación de enlaces de Rust en Python El proyecto más reconocido para crear Rust Los enlaces en Python son PyO3. Se puede utilizar para escribir módulos de Python en Rust o para incrustar el tiempo de ejecución de Python en un binario de Rust. PyO3 aprovecha otro proyecto, Maturin, que es una herramienta para crear cajas de Rust con paquetes y enlaces de Python. Cuando se instala en un entorno virtual de Python, Maturin se puede usar desde la línea de comando para inicializar un nuevo proyecto de Rust con enlaces de Python habilitados. El desarrollador utiliza directivas en el código de Rust para indicar qué funciones de Rust exponer a Python y cómo exponer todo el proyecto de Rust a Python como un módulo importable. Mapeo de tipos Rust y PythonUno de los aspectos útiles de PyO3 son sus mapeos entre tipos Rust y Python. Las funciones escritas en Rust pueden aceptar tipos nativos de Python o tipos de Rust convertidos a partir de tipos de Python. Por ejemplo, un objeto bytearray o bytes en Python se asigna elegantemente a un Vec en Rust, y una cadena en Python se puede representar como una cadena de Rust. Los tipos más complejos, como un diccionario de Python o un número entero que es demasiado grande para un entero nativo de la máquina, también tienen conversiones de Rust, pero algunos requieren componentes opcionales. Por ejemplo, si desea utilizar números enteros de Python de tamaño arbitrario, instalaría la característica opcional num-bigint en PyO3 y expresaría esos números enteros en Rust como tipos num_bigint::BigInt o num_bigint::BigUint. La conversión de Python a Rust genera un costo por llamada, pero le libera de tener que usar tipos de Python por completo en el código de Rust. En el mundo Cython, esto es similar a las conversiones a tipos C: hay un costo por cada conversión, pero conllevan importantes aceleraciones si su objetivo es el procesamiento numérico completamente en C. Llamar a Python desde Rust Si es principalmente un desarrollador de Rust pero Si desea utilizar Python dentro de una aplicación Rust, PyO3 también tiene mecanismos para llamar a Python desde el código Rust. El código Python se puede definir en línea en un programa Rust, compilarse en código de bytes de Python y ejecutarse mediante llamadas de Rust. Las estructuras Rust como HashMap o BTreeMap se pueden usar para pasar listas de argumentos posicionales o de palabras clave. Incluso puedes evaluar expresiones individuales si eso es todo lo que necesitas. Los programas de Rust pueden invocar al intérprete CPython y trabajar con él, lo que te permite crear y manipular objetos de Python en Rust y realizar llamadas a la biblioteca. Los archivos de código Python existentes también se pueden cargar y utilizar, pero es un riesgo potencial para la seguridad, así que no cargue código que no sea de confianza ni utilice esta opción en una situación en la que pueda hacerlo. Si está más familiarizado con Rust que con Python, es una buena idea tener al menos una familiaridad superficial con la API de Python C y los diversos tipos de objetos de Python antes de sumergirse. Un proyecto anterior, cpython crate, también permitió Python dentro de Rust. aplicación, pero ya no se mantiene activamente y sus desarrolladores recomiendan usar PyO3 en su lugar. Consejo de rendimiento Una advertencia importante con PyO3 es minimizar siempre la cantidad de veces que los datos se pasan de un lado a otro entre los dos lenguajes. Cada llamada de Python a Rust o viceversa genera algunos gastos generales. Si la sobrecarga supera el trabajo que está haciendo en Rust, no verá ninguna mejora significativa en el rendimiento. Como ejemplo, si está realizando un bucle sobre una colección de objetos, envíe el objeto a Rust y realice el bucle allí. Esto es más eficiente que realizar un bucle en el lado de Python y llamar al código Rust con cada iteración del bucle. Esta directriz también se aplica en general a las integraciones entre Python y otro código que utiliza la ABI de Python C, como los módulos Cython. Copyright © 2024 IDG Communications, Inc.

Source link