Итак, два вложенных цикла от 1 до 10000 чисто на питоне на моей машине выполняются примерно за 4.5-5 секунд. С использованием Cython - 2.7-3.1. Чисто на С - 0.25-0.35.
Вот решил ещё попробовать написать сам с нуля модуль, вот смотрю на эти вещи:
https://docs.python.org/3/extending/extending.html
https://stackoverflow.com/questions/43621948/c-python-module-import-error-undefined-symbol-py-initmodule3-py-initmodu
А вот мой setup.py:
from distutils.core import setup, Extension setup(name='loops_lib', version='1.0', \ ext_modules=[Extension('loops_lib', ['loops_lib_for_python.c'])])
В общем, не получается написать/заставить работать. Либо билдится, но не могу использовать, либо не билдится вообще. Вот такие ошибки в разных вариантах:
ImportError: loops_lib.cpython-35m-x86_64-linux-gnu.so: undefined symbol: Py_InitModule3
либо так
ImportError: dynamic module does not define module export function (PyInit_loops_lib)
Даже полностью готовый рабочий пример чего-нибудь мне найти не удалось. Одни пишут, что то устарело, другие - то. Как говорила одна особь - сложна, сложна!
Подскажите хороший современный гайд, пожалуйста, желательно для Python 3
===
Обновление #1: выложу таки свои попытки что-то сделать:
#include<Python.h> static PyObject *nested_loops_2(PyObject *self, PyObject *args) { long int count1, count2; unsigned long long int counter; if (!PyArg_ParseTuple(args, "ll", &count1, &count2)) { return NULL; } counter = 0; for (int i=0; i<count1; i++) for (int j=0; j<count1; j++) counter += 1; return Py_BuildValue("llu", counter); } static char nested_loops_2_docs[] = "nested_loops_2( ): Run 2 nested loops and count iterations\n"; //static PyMethodDef nested_loops_2_funcs[] = { // {"nested_loops_2", (PyCFunction)nested_loops_2, // METH_VARARGS, nested_loops_2_docs}, // {NULL, NULL, 0, NULL} //}; static PyMethodDef module_methods[] = { {"nested_loops_2", (PyCFunction) nested_loops_2, METH_VARARGS, nested_loops_2_docs}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef struct_nested_loops_2 = { PyModuleDef_HEAD_INIT, "loops_lib", NULL, -1, module_methods }; //void init_nested_loops_2(void) { // Py_InitModule3("nested_loops_2", module_methods); //} //PyMODINIT_FUNC PyInit_nested_loops_2(void) //{ // return PyModule_Create(&struct_nested_loops_2); //}