Python C extension minimal example
Create file myext.c:
#include <Python.h>
PyObject * add(PyObject *self, PyObject *args) {
long num1, num2;
if(!PyArg_ParseTuple(args, "ll", &num1, &num2))
return NULL;
return PyLong_FromLong(num1 + num2);
}
PyMethodDef myext_method_defs[] = {
{
"add",
(PyCFunction)add,
METH_VARARGS,
"Add two numbers."
},
{
NULL
}
};
PyModuleDef myext_module_def = {
PyModuleDef_HEAD_INIT,
"myext",
"My extension.",
-1,
myext_method_defs,
NULL,
NULL,
NULL,
NULL
};
PyMODINIT_FUNC PyInit_myext(void) {
return PyModule_Create(&myext_module_def);
}Create file setup.py:
# coding: utf-8
from setuptools import Extension
from setuptools import setup
setup(
name = 'myext',
version = '0.0.1',
ext_modules = [
Extension('myext', ['myext.c'])
]
)Create file test.py:
# coding: utf-8
import myext
c_add = myext.add
def py_add(a, b):
return a + b
if __name__ == '__main__':
from timeit import Timer
number = 1000000
timer = Timer('c_add(1, 2)', 'from __main__ import c_add')
print(timer.timeit(number=number))
timer = Timer('py_add(1, 2)', 'from __main__ import py_add')
print(timer.timeit(number=number))Compile the C extension:
python setup.py buildCopy the result .pyd file (./build/lib.win-amd64-3.7/myext.cp37-win_amd64.pyd for example) to current directory.
Run the test file:
python test.pyTested working with Python 3.7.0.
Comments: