Python/C, CTypes, SWIG y Cython son opciones para acceder a código C desde Python. Python/C permite escribir código C directamente, mientras que CTypes, SWIG y Cython generan código intermediario. CTypes no requiere compilación pero tiene menos soporte para C++. SWIG y Cython generan código pero requieren compilación. Cython ofrece la mejor optimización al compilar código Python en C.
2. RAZONES PARA ACCEDER A C DESDE
PYTHON
1. Utilizar una librería implementada en C/C++
2. Acelerar nuestro código
3. Embeber Python como lenguaje de script en nuestro
producto
4. ¿CUÁL ES LA BUENA?
De eso va esta charla
La respuesta es muy sencilla
Depende ;-)
5. PAŔAMETROS PARA TOMAR UNA
DECISIÓN
¿Necesitamos librerías adicionales?
¿Código intermedio autogenerado?
¿Necesita ser compilado?
¿Qué tal se lleva con NumPy?
¿Necesito soporte para C++, o me vale con C?
6. AVISOS PARA NAVEGANTES
Si Cuando nuestro código peta en C, se llevará por delante
al intérprete de Python.
Necesitamos un compilador de C.
Si queremos que nuestro módulo funcione en las tres
plataformas principales (Linux/Mac/Windows)
necesitaremos tres compiladores.
Problemas típicos en C: desbordamiento de buffers, fugas
de memoria, punteros, etc...
7. OPCIÓN 1: API PYTHON/C
Podemos escribir directamente código en C, que puede
ser llamado desde Python, aceptando y/o devolviendo
objetos nativos de Python
No es tan complicado, si es un caso de uso sencillo. Es
sobre todo código repetitivo: parsear argumentos de
entrada, convertir tipos de datos de entrada, convertir
tipos de datos de salida...
Lo más complicado es el tema de los contadores de
referencias, y quien es el responsable de incrementarlos y
decrementarlos.
10. PROS Y CONTRAS
No necesita librerías adicionales
Puede llamar a código C y C++
Podemos usar distutilspara compilar y distribuir
NumPY tiene una extensión para usar Arrays
Puede resultar complejo de mantener
Hay que escribir bastante código intermedio
Necesita compilar
11. OPCION 2: CTYPES
Ctypes es una librería estándar de Python que nos
permite realizar llamadas a librerías externas
Proporciona conversión a datos nativos de C, y permite
llamar a librerías estáticas o dinámicas (*.so en Linux,
*.DLL en Windows, *.dylib en Mac)
Podemos llamar a código C sin escribir ni una línea de C,
solo un wrapper en Python
13. PROS Y CONTRAS DE CTYPES
No necesita librerías adicionales ¡Viene en la librería
estándar!
No necesita compilador
No necesitas saber C, todo se hace en Python
Puede llamar a código C ... pero lo tiene más
complicado para C++
NumPY tiene algunas extensiones para usar con cTypes
... pero el soporte no es completo
Las conversiones entre datos pueden ser más lentas
Puede ser complicado si queremos código
multiplataforma
14. OPCIÓN 3: SWIG
SWIG significa Simplified Wrapper Interface Generator
Es una herramienta que conecta librerías escritas en C y
en C++ con varios lenguajes de alto nivel, entre ellos
Python
SWIG autogenera el código repetitivo de los wrappers por
tí (Porque tú lo vales)
Se basa en la interfaz Python-C que vimos como primera
opción
17. PROS Y CONTRAS DE SWIG
Puede generar el código wrapper automáticamente a
partir de los ficheros *.h de C
Pero ese código es un coñazo puede ser difícil de
entender para humanos
Puede trabajar indistintamente con C y con C++
Puede generar interfaces con otros lenguajes además
de python
Tiene soporte para NumPY
Tiene una curva de aprendizaje un poco dura
18. OPCIÓN 4: CYTHON
Cython (No confundir con CPython) es un lenguaje y
compilador pensado para escribir extensiones en C/C++
Es un Super Conjunto de Python, es decir, todo*
programa correcto en Python es también un programa
Cython
* Casi todo
Cython añade ciertas anotaciones y estructuras para
realizar llamadas a código C
Como beneficio añadido, Cython compila, lo que ofrece
una mejora de rendimiento inmediato
19. MÁS COSAS DE CYTHON
Lo más interesante es que permite hacer optimización
iterativa. Empiezas con tu código Python original y poco a
poco optimizas lo te interese
Es parecido a SWIG ya que genera automáticamente
código de wrapping, pero no usa un fichero externo,
sino que se especifican las opciones de wrapping
directamente sobre el código Python
Al igual que SWIG, se apoya en la interfaz Python-C que
vimos como primera opción
21. PROS Y CONTRAS DE CYTHON
Lenguaje similar a Python (Algo así como Python con
tipos) que nos permite escribir extensiones en C/C++
Compila código Python puro, obteniendose un
incremento aproximado de rendimiento de un 50% desde
el minuto cero
Código autogenerado (Pero Soporta GNU debugger)
Permite optimización iterativa
Soporta NumPy
Necesita compilador
22. RESUMEN
Python/C CTypes SWIG Cython
Librería
adicional
No No Si Si
Código
generado
No No Si Si
Hay que
compilar
Si No Si Si
C++ Si Parcial Parcial Si
NumPy Si Parcial Si Si