Kami melanjutkan topik tentang cara memanggil C / C ++ dari Python3 . Sekarang kita menggunakan API C untuk membuat modul, dalam contoh ini kita dapat mengetahui bagaimana cffi dan perpustakaan lain menyederhanakan hidup kita. Karena menurut saya ini adalah cara yang paling sulit.
C
Pustaka uji untuk mendemonstrasikan bekerja dengan variabel global, struktur, dan fungsi dengan argumen dari berbagai jenis. Dalam artikel saya, saya menggunakan variasi dari perpustakaan yang sama, tergantung pada metode yang sekarang saya gunakan. Tautan ke metode sebelumnya di bawah ini.
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
Modul ini diperlukan untuk menunjukkan bahwa itu akan mencakup: fungsi, variabel global dan struktur. Setiap hal seperti itu perlu dijelaskan, hal yang paling sulit untuk tipe datanya (struktur ...) Kira-kira file seperti itu dihasilkan oleh cffi .
Agar berfungsi, Anda harus menghubungkan file header:
#include <Python.h> #include <structmember.h> //
Bendera kompilasi:
$(python3-config --includes --ldflags) -fPIC
Fungsi berikut bertanggung jawab untuk memproses argumen:
PyArg_ParseTuple(args, "ids", &val1, &val2, &val3);
Yang pertama adalah argumen tipe int, ia memiliki penunjukan huruf i
2nd float / double - d
String ketiga - dtk
Semua kemungkinan penunjukan huruf dari tipe data dapat ditemukan di sini.
Sekarang kita beralih ke deskripsi bagaimana menggambarkan struktur.
struct.c:
Dan itu saja untuk:
struct test_st_s { PyObject_HEAD
Setuju, tidak sedikit. Selain itu, metode dapat didefinisikan untuk struktur (sebagai contoh, test_st_print ).
Dalam kode, saya mencoba membuat lebih banyak komentar untuk menjelaskan secara terpisah lebih sedikit.
Python
Contoh bekerja dengan modul C dari Python :
import sys import time
Modul telah menjadi asli.
Pro dan Kontra dari API C
Pro :
- mudah digunakan di python
Cons :
- sulit untuk menggambarkan tipe data Anda dalam C API
- sulit bagi programmer murni untuk mengimplementasikan Python , dan juga tidak untuk mereka ... (bagi saya yang paling sederhana adalah melalui ctypes )
- module (library) hanya untuk Python
Waktu pelaksanaan pengujian rata-rata pada setiap metode dengan 1000 dimulai:
- ctypes: - 0,0004987692832946777 detik ---
- CFFI: - 0,00038521790504455566 detik ---
- pybind: - 0,0004547207355499268 detik ---
- API C: - 0,00035619735717773444 detik ---
Referensi