نواصل موضوع كيفية استدعاء C / C ++ من Python3 . الآن نستخدم واجهة برمجة التطبيقات C لإنشاء الوحدة النمطية ، في هذا المثال يمكننا معرفة كيف تبسط cffi والمكتبات الأخرى حياتنا. لأنه في رأيي هذه هي الطريقة الأكثر صعوبة.
C
مكتبة اختبار لشرح العمل مع المتغيرات العالمية والهياكل والوظائف مع الوسائط من أنواع مختلفة. في مقالاتي ، استخدم أشكالًا مختلفة من المكتبة نفسها ، اعتمادًا على الطريقة التي أستخدمها الآن. روابط إلى الطرق السابقة أدناه.
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
الوحدة مطلوبة للإشارة إلى أنها ستتضمن: الوظائف والمتغيرات والهياكل العالمية. كل شيء من هذا القبيل يحتاج إلى وصف ، أصعب شيء لأنواع البيانات الخاصة به (بنية ...) يتم إنشاء هذا الملف تقريبًا بواسطة cffi .
للعمل ، يجب عليك توصيل ملفات الرأس:
#include <Python.h> #include <structmember.h> //
أعلام تجميع:
$(python3-config --includes --ldflags) -fPIC
الوظيفة التالية مسؤولة عن معالجة الوسائط:
PyArg_ParseTuple(args, "ids", &val1, &val2, &val3);
الأولى هي حجة من النوع int ، لها تسمية الحرف i
ثاني تعويم / مزدوج - د
السلسلة الثالثة
يمكن العثور هنا على جميع التعيينات الممكنة لخطابات أنواع البيانات .
ننتقل الآن إلى وصف كيفية وصف الهيكل.
struct.c:
وهذا كله من أجل:
struct test_st_s { PyObject_HEAD
توافق ، ليس قليلا. علاوة على ذلك ، يمكن تعريف الطرق للبنية (كمثال ، test_st_print ).
في التعليمات البرمجية ، أحاول تقديم المزيد من التعليقات لوصف بشكل منفصل أقل.
الثعبان
مثال على العمل مع وحدة C من Python :
import sys import time
أصبحت الوحدة الأم.
إيجابيات وسلبيات C API
الايجابيات :
سلبيات :
- من الصعب وصف أنواع البيانات الخاصة بك في C API
- من الصعب على المبرمجين البحتين تنفيذ برنامج Python ، وليس بالنسبة لهم أيضًا ... (بالنسبة لي أبسط ما يكون عبر ctypes )
- الوحدة (المكتبة) ستكون فقط لبيثون
يبدأ متوسط وقت تنفيذ الاختبار في كل طريقة بـ 1000:
- ctypes: - 0.0004987692832946777 seconds ---
- CFFI: - 0.00038521790504455566 ثانية ---
- pybind: - 0.0004547207355499268 ثانية ---
- C API: - 0.0003561973571777344 ثانية ---
مراجع