Комментарии 14
Именно поэтому математические библиотеки для питона написаны на C++
либо на Fortran
и работают довольно быстро, так что обычно самому ничего не нужно писать, просто берёте Numpy
и всё считается в питоне моментально. А то, для расчёта чего чего нет готовых методов в Numpy
, довольно часто можно ускорить с помощью опять же готовой библиотеки Numba
. Ну и есть куча других тонкостей (использование подходящих структур данных и методов, кэширование и т.д.), благодаря чему чистый C++
для питониста почти не нужен.
Спасибо за развернутый комментарий, учту эти факты для дальнейшего развития.
Вообще-то Numpy
написан с использованием С, а не на С++. Большинство подобных библиотек написано на С, что логично, т.к. сам Python тоже написан на С.
что логично, т.к. сам Python тоже написан на С.
Одно из другого ни как не следует. А если бы следовало - это означало бы только плохой дизайн API.
The Application Programmer’s Interface to Python gives C and C++ programmers access to the Python interpreter at a variety of levels. The API is equally usable from C++, but for brevity it is generally referred to as the Python/C API.
https://docs.python.org/3/c-api/intro.html
Си проще для небольших библиотек, чем С++ и порог вхождения в Си близок к порогу вхождения в Python, в то время, как для С++ он гораздо выше.
"usable" не означает, что это правильно и удобно. Всё-таки писать на С++ в стиле С - довольно неблагодарное занятие, а если не в стиле С, то это означает сильно отличаться от кода стандартных библиотек Python, что также сомнительный выбор для задачи расширения возможностей Python (как и любой необоснованный зоопарк языков в проекте).
Исключение тут составляют библиотеки, которые изначально были написаны на другом языке, а далее уже был сделан биндинг для Python.
Нет никакого смысла стремиться к тому чтобы код был похож на код стандартных библиотек Python, уж скорее есть смысл в обратном. Удобно и правильно писать на полноценном идиоматичном C++, а сишная прослойка между ним и питоновским API будет очень тонкой и ограниченной конвертацией аргументов и возвращаемых значений между PyObject и плюсовыми типами. В случае же когда код модуля вынужден оперировать PyObject'ами, я вообще считаю преступлением писать руками простыни Py_INC/DEC/XDECREF'ов вместо того чтобы обернуть PyObject в плюсовый класс с поддержкой move semantics и явной передачей владения/заимствованием и писать на нем лаконичный, понятный и безопасный код.
Никогда не измеряйте время выполнения python кода таким образом. Используйте https://docs.python.org/3/library/timeit.html
Так же можно использовать соответствующие magic команды в jupyter блокнотах.
Разве это не было очевидно?
С использованием Python.h можно написать питоний модуль прямо на С, как, собственно, написан сам питон или, например, библиотека парсинга временных меток ciso8601 https://github.com/closeio/ciso8601
Плюс есть ещё sip, от riverbank computers, тот самый который разрабатывает pyqt, и наверняка ещё пару методов интеграции С/С++ и питона найдётся.
Название для публикации вы выбрали несколько странное, на самом деле вы написали туториал по модулю ctypes. Но никакого смысла вы не обсудили. Весь ваш смысл в том, что С быстрее питона, что очень тривиально. Для технической работы это очень небрежное оформление заголовка. Возможно поэтому публикация заработала несколько минусов.
Ещё f2py есть, но это прям для олдов, которым numpy like работа с массивами нужна
Ух ты, статья настоящий прорыв! Спасибо автору за тщательно проведенное исследование такой малоизученной темы!
# заполняю массив в С
for i in range(len(my_array)):
my_lib.addItemInArray(i, my_array[i])
В Python3 такая конструкция получения индексов + значений из массива крайне неэффективна. Используйте enumerate().
Python3 + C, есть ли смысл?