Continuamos con el tema de cómo llamar a C / C ++ desde Python3 . Ahora usamos la API de C para crear el módulo, en este ejemplo podemos descubrir cómo cffi y otras bibliotecas simplifican nuestras vidas. Porque en mi opinión esta es la forma más difícil.
C
Una biblioteca de prueba para demostrar el trabajo con variables globales, estructuras y funciones con argumentos de varios tipos. En mis artículos uso variaciones de la misma biblioteca, dependiendo del método que ahora uso. Enlaces a métodos anteriores a continuación.
prueba.h
typedef struct test_st_s test_st_t; extern int a; extern double b; extern char c; static PyObject *func_hello(PyObject *self, PyObject *args); static PyObject *func_ret_int(PyObject *self, PyObject *args); static PyObject *func_ret_double(PyObject *self, PyObject *args); static PyObject *func_ret_str(PyObject *self, PyObject *args); static PyObject *func_many_args(PyObject *self, PyObject *args); static PyObject *func_ret_struct(PyObject *self, PyObject *args); struct test_st_s { PyObject_HEAD
prueba.c
Se requiere que el módulo indique que incluirá: funciones, variables globales y estructuras. Cada una de estas cosas necesita ser descrita, lo más difícil para sus tipos de datos (estructura ...) Aproximadamente un archivo así es generado por cffi .
Para trabajar, debe conectar los archivos de encabezado:
#include <Python.h> #include <structmember.h> //
Banderas de compilación:
$(python3-config --includes --ldflags) -fPIC
La siguiente función es responsable de procesar los argumentos:
PyArg_ParseTuple(args, "ids", &val1, &val2, &val3);
El primero es un argumento de tipo int, tiene la designación de letra i
2 ° flotador / doble - d
3ra cuerda - s
Todas las posibles designaciones de letras de tipos de datos se pueden encontrar aquí.
Ahora pasamos a la descripción de cómo describir la estructura.
struct.c:
Y eso es todo por:
struct test_st_s { PyObject_HEAD
De acuerdo, no un poco. Además, se pueden definir métodos para la estructura (como ejemplo, test_st_print ).
En el código, trato de hacer más comentarios para describir por separado menos.
Pitón
Un ejemplo de trabajo con un módulo C de Python :
import sys import time
El módulo se ha convertido en nativo.
Pros y contras de la API de C
Pros :
Contras :
- difícil describir sus tipos de datos en C API
- es difícil para los programadores puros implementarlo en Python , y tampoco para ellos ... (para mí lo más simple es a través de ctypes )
- módulo (biblioteca) será solo para Python
El tiempo promedio de ejecución de la prueba en cada método con 1000 comienza:
- tipos: - 0.0004987692832946777 segundos ---
- CFFI: - 0.00038521790504455566 segundos ---
- pybind: - 0.0004547207355499268 segundos ---
- API de C: - 0.0003561973571777344 segundos ---
Referencias