Wir setzen das Thema fort, wie C / C ++ von Python3 aufgerufen wird . Jetzt verwenden wir die C-API , um das Modul zu erstellen. In diesem Beispiel können wir herausfinden, wie CFFI und andere Bibliotheken unser Leben vereinfachen. Denn meiner Meinung nach ist dies der schwierigste Weg.
C.
Eine Testbibliothek zur Demonstration der Arbeit mit globalen Variablen, Strukturen und Funktionen mit Argumenten verschiedener Typen. In meinen Artikeln verwende ich Variationen derselben Bibliothek, abhängig von der Methode, die ich jetzt verwende. Links zu früheren Methoden unten.
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
Das Modul muss angeben, dass es Folgendes enthält: Funktionen, globale Variablen und Strukturen. Jedes dieser Dinge muss beschrieben werden, das Schwierigste für seine Datentypen (Struktur ...). Ungefähr eine solche Datei wird von cffi generiert.
Um zu arbeiten, müssen Sie die Header-Dateien verbinden:
#include <Python.h> #include <structmember.h> //
Kompilierungsflags:
$(python3-config --includes --ldflags) -fPIC
Die folgende Funktion ist für die Verarbeitung der Argumente verantwortlich:
PyArg_ParseTuple(args, "ids", &val1, &val2, &val3);
Das erste ist ein Argument vom Typ int, es hat die Buchstabenbezeichnung i
2. Schwimmer / Doppel - d
3. Saite - s
Alle möglichen Buchstabenbezeichnungen von Datentypen finden Sie hier.
Nun wenden wir uns der Beschreibung der Struktur zu.
struct.c:
Und das ist alles für:
struct test_st_s { PyObject_HEAD
Stimmen Sie zu, nicht wenig. Darüber hinaus können Methoden für die Struktur definiert werden (als Beispiel test_st_print ).
Im Code versuche ich, mehr Kommentare zu machen, um weniger separat zu beschreiben.
Python
Ein Beispiel für die Arbeit mit einem C- Modul aus Python :
import sys import time
Das Modul ist nativ geworden.
Vor- und Nachteile der C-API
Vorteile :
- einfach in Python zu verwenden
Nachteile :
- Es ist schwierig, Ihre Datentypen in der C-API zu beschreiben
- Für reine Programmierer ist es schwierig, Python zu implementieren, und auch nicht für sie ... (für mich ist es am einfachsten, ctypes zu verwenden. )
- Modul (Bibliothek) ist nur für Python
Die durchschnittliche Testausführungszeit für jede Methode mit 1000 Starts:
- ctypes: - 0,0004987692832946777 Sekunden ---
- CFFI: - 0,00038521790504455566 Sekunden ---
- pybind: - 0,0004547207355499268 Sekunden ---
- C API: - 0,0003561973571777344 Sekunden ---
Referenzen