Continuamos o tópico de como chamar C / C ++ a partir do Python3 . Agora usamos a API C para criar o módulo. Neste exemplo, podemos descobrir como o cffi e outras bibliotecas simplificam nossas vidas. Porque, na minha opinião, esse é o caminho mais difícil.
C
Uma biblioteca de teste para demonstrar o trabalho com variáveis globais, estruturas e funções com argumentos de vários tipos. Nos meus artigos, uso variações da mesma biblioteca, dependendo do método que agora uso. Links para métodos anteriores abaixo.
test.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
test.c
O módulo é necessário para indicar que incluirá: funções, variáveis e estruturas globais. Cada uma dessas coisas precisa ser descrita, a coisa mais difícil para seus tipos de dados (estrutura ...) Aproximadamente esse arquivo é gerado pelo cffi .
Para funcionar, você deve conectar os arquivos de cabeçalho:
#include <Python.h> #include <structmember.h> //
Sinalizadores de compilação:
$(python3-config --includes --ldflags) -fPIC
A seguinte função é responsável pelo processamento dos argumentos:
PyArg_ParseTuple(args, "ids", &val1, &val2, &val3);
O primeiro é um argumento do tipo int, com a designação de letra i
2º flutuador / duplo - d
3a corda - s
Todas as designações possíveis de tipos de dados podem ser encontradas aqui.
Agora nos voltamos para a descrição de como descrever a estrutura.
struct.c:
E isso é tudo para:
struct test_st_s { PyObject_HEAD
Concordo, nem um pouco. Além disso, os métodos podem ser definidos para a estrutura (como um exemplo, test_st_print ).
No código, tento fazer mais comentários para descrever separadamente menos.
Python
Um exemplo de trabalho com um módulo C do Python :
import sys import time
O módulo tornou-se nativo.
Prós e contras da API C
Prós :
Contras :
- difícil descrever seus tipos de dados na API C
- é difícil para programadores puros implementar no Python , e não para eles também ... (para mim, o mais simples é através de ctypes )
- O módulo (biblioteca) será apenas para Python
O tempo médio de execução do teste em cada método com 1000 inicia:
- ctypes: - 0.0004987692832946777 segundos ---
- CFFI: - 0.00038521790504455566 segundos ---
- pybind: - 0.0004547207355499268 segundos ---
- API C: - 0,0003561973571777344 segundos ---
Referências