рд╣рдо рдкрд╛рдпрдерди 3 рд╕реЗ C / 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 рд╣реИ
2 рдлреНрд▓реЛрдЯ / рдбрдмрд▓ - рдбреА
рддреАрд╕рд░рд╛ рддрд╛рд░ - s
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрддреНрд░ рдкрджрдирд╛рдо рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░реЗрдВред
struct.c:
рдФрд░ рд╡рд╣ рд╕рдм рдХреЗ рд▓рд┐рдП рд╣реИ:
struct test_st_s { PyObject_HEAD
рд╕рд╣рдордд рд╣реВрдВ, рдереЛрдбрд╝рд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, test_st_print )ред
рдХреЛрдб рдореЗрдВ, рдореИрдВ рдЕрд▓рдЧ рд╕реЗ рдХрдо рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдЬрдЧрд░
рдкрд╛рдпрдерди рд╕реЗ рд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import sys import time
рдореЙрдбреНрдпреВрд▓ рджреЗрд╢реА рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╕реА рдПрдкреАрдЖрдИ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖
рдкреЗрд╢реЗрд╡рд░реЛрдВ :
- рдЕрдЬрдЧрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ
рд╡рд┐рдкрдХреНрд╖ :
- C API рдореЗрдВ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
- рд╢реБрджреНрдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ ... (рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ cypyps рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ)
- рдореЙрдбреНрдпреВрд▓ (рдкреБрд╕реНрддрдХрд╛рд▓рдп) рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛
1000 рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдкрд░ рдФрд╕рдд рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
- ctypes: - 0.0004987692832946777 рд╕реЗрдХрдВрдб ---
- CFFI: - 0.00038521790504455566 рд╕реЗрдХрдВрдб ---
- pybind: - 0.0004547207355499268 рд╕реЗрдХрдВрдб ---
- C API: - 0.0003561973571777344 рд╕реЗрдХрдВрдб ---
рд╕рдВрджрд░реНрдн