Найти - Пользователи
Полная версия: На чем вы пишите высоконагруженные части системы: C++ или Cython?
Начало » Python для экспертов » На чем вы пишите высоконагруженные части системы: C++ или Cython?
1 2 3
Sanya28
Python 3.7.1

Чтобы ускорить часть кода написал его на Cython (с С- типами и С-методами) и действительно поулчил хорошее ускорение. Но закаралось подозрение в этом методе:
1. Практически невозможно отлаживать (видно только ошибки компиляции). А я, к сожалению, не умею писать код сразу без ошибок.
2. Получился очень странный язык, представляющий из себя смесь Python / C++, поэтому сложнее найти помощь в инете.
3. Cython представляет подмножество С++ (особенно если учесть, что С++11 / С++14 / С++17 очень сильно изменили язык).

С другой стороны при самостоятельной разработки высоконагруженных частей на С++ придется писать лишний код, чтобы как- то протестировать полученную библиотеку (подать ей на вход весь возможный набор данных).

Не думаю, что серьзные проекты пишут на Cython, скорее всего используют его только для вызова библиотек, написанных на С/С++.

Может кто- то поделиться своим решением этого вопроса?

p.s. Пожалуйста, не предлагайте Numa: на сегодняшний день она может очень мало (ускоряет код только при работе с числами, а с остальными типами получается скорость обычного Python- кода).
doza_and
Cython вообще не используем.
Большая часть кода которая пишется на питоне некритична ко времени выполнения. Критоичные части пишутся на C++/C. Питон используется как скриптовый язык или встраиванием в приложение или как управляющий скрипт. Для плюсов используем pybind11, boost python.
Sanya28

doza_and
Cython вообще не используем.
Большая часть кода которая пишется на питоне некритична ко времени выполнения. Критоичные части пишутся на C++/C. Питон используется как скриптовый язык или встраиванием в приложение или как управляющий скрипт. Для плюсов используем pybind11, boost python.

Спасибо за ответ!
Изучил pybind11 с boost-ом, но честно говоря не нашел преимуществ над Cython (если последний использовать только для вызова С/С++ библиотек): также надо писать текст с декларациями функций и классов, чтобы их потом использовать. Можете ответить: что вас привлекло в вашем решении?

+ За кадром остался вопрос отладки и профилирования С++ кода: насколько я понял в вашем случае также необходимо как- то передавать вычислительному ядру исходные данные, для чего нужен лишний код.

Интересно, есть ли способ преобразовать Python- программу в корректный проект с исходниками на С++, чтобы, дописав высоконагруженное вычислительное ядро на С++, собрать весь проект и иметь возможность отладить / профилировать?
doza_and
Sanya28
Можете ответить: что вас привлекло в вашем решении?
Я бы не сказал привлекло. Скорее наименьшее из зол (ctypes, cffi, swig, cython, sip, common c extension).
Последнее время были заботы с приделыванием интерфейсов к миллионам статических объектов.
ctypes, cffi просто умирают на этой задаче. а pybind11 держит удар.

Sanya28
но честно говоря не нашел преимуществ над Cython
Давненько смотрел Cython, не являюсь по нему специалистом, могу чтото и упустить.

Основные проблемы которые не дали использовать Cython именно для интерфейсов с C++

1 интерфейсы на c++ в pybind11 надо описать файл с интерфейсами в c++ один раз.

А в Cython явно не один раз. http://docs.cython.org/en/latest/src/userguide/wrapping_CPlusPlus.html
Те описываем сишный объект

 cdef extern from "Rectangle.h" namespace "shapes":
    cdef cppclass Rectangle:

Потом питоновский:
 cdef class PyRectangle:
    cdef Rectangle c_rect  # Hold a C++ instance which we're wrapping
    def __cinit__(self, int x0, int y0, int x1, int y1):
        self.c_rect = Rectangle(x0, y0, x1, y1)

Всякие ссыки на внутренние объекты self.c_rect выглядят не только многословно но и глупо.

2. Билд при помощи o python setup.py build_ext –inplace в больших проектах просто неприемлем. Проект имеет кучу зависимостей, надо одновременно использовать разные компиляторы, управлять разрядностью образа, способом отладки используемым рантаймом и т.д , и т.п. Инструментарий сборки лучше делать один раз и он зачастую непростой и делается он на условно сишной стороне.

3. Я в документации ситона не нашел способа работы с указателями, а это совершенно необходимо для нас, да думаю и для вас.

Sanya28
За кадром остался вопрос отладки и профилирования С++ кода
Тут я собственно не понимаю в чем у вас проблема. Питон вместе с подгруженными модулями это обычное приложение на C++. Берете и пользуетесь обычными отладчиком и профилировщиком. Ничем не отличается от сишного приложения. Ну при желании правда можно и питоновский отладчик/ide запустить из под отладчика сишного. Тогда будет два уровня отладки, питоновский и сишный.

Sanya28
асколько я понял в вашем случае также необходимо как- то передавать вычислительному ядру исходные данные,
Для работы с объектами вы их создаете. В конструктор объектов передаются аргументы, очевидно на питоновской стороне. Почему это лишний код? Он всегда необходим. А конвертацией чисто питоновских структур данных в сишные занимается по большей части рекурсивный код автоматических преобразований типов (в pybind11). Оно все по умолчанию делается, вы об этом можете не заботиться пока вас производительность этого процесса устраивает.

Sanya28
Интересно, есть ли способ преобразовать Python- программу в корректный проект с исходниками на С++
А зачем вам тогда вообще питон нужен? Пишите сразу на C++. Про отладку я писал, проблем нет.

Да и забыл упомянуть самый часто используемый у нас способ связывания питона и C++.

Сиашное приложение работает само питоновское само, а общаются они через сокеты по заранее согласованному протоколу. На питоне есть библиотека которая создает прокси объекты привязанные к объектам на сишной сотороне. Простненький такой RPC.

По сути ошибки в приложении не валят питон, питон не валит приложение, нет проблем объединить несколько приложений, причем даже работающих на разных машинах.




py.user.next
Sanya28
Чтобы ускорить часть кода написал его на Cython (с С- типами и С-методами) и действительно поулчил хорошее ускорение.
doza_and
А зачем вам тогда вообще питон нужен? Пишите сразу на C++.
Sanya28, нужно было сначала посмотреть, как у других сделано. В одном проекте используй несколько языков. Тогда ты и будешь иметь к каждому компоненту свой набор нативных инструментов.
Sanya28
doza_and
Тут я собственно не понимаю в чем у вас проблема. Питон вместе с подгруженными модулями это обычное приложение на C++. Берете и пользуетесь обычными отладчиком и профилировщиком.

Возможно я не знаю какого-то хитрого способа отладки (например, с помощью командной строки). Я привык отлаживать с помощью IDE: запускаю удобный Qt Creator, ставлю точку останова и дожидаюсь когда исполнение программы придет в нужное мне место (чтобы потом по шагам контролировать изменение переменных модуля).

А теперь давайте представим ситуацию, в которой Python выполняет 99% кода и по сути является оберткой над маленьким вычислительным ядром С++- кода. Насколько я понимаю при отладке нужны исходники отлаживаемого приложения (чего нет в случае работы исполняемой программы “python3”- я работаю на Ubuntu, и у нас нет никаких exe- расширений у исполняемых файлов). Как я, используя Qt Creator, смогу отладить С++ код вычислительного ядра?

Только для этого я и задавал вопрос перевода всего Python- кода в С++ код: чтобы была возможность в Qt Creator удобно произвести отладку.

Профилировку действительно можно попробовать запустить (я использую Vtune Amplifier), указав в качестве исполняемого файла python3, а в параметрах запуска- расположение main.py (в котором запускается выполнение всей программы, включая вычислительное C++- ядро).
Sanya28
py.user.next
Sanya28, нужно было сначала посмотреть, как у других сделано. В одном проекте используй несколько языков. Тогда ты и будешь иметь к каждому компоненту свой набор нативных инструментов.

Я очень этого хочу, но непонятно как я буду выполнять отладку отдельных частей приложения. Вычислительное ядро С++ лежит “глубоко внизу”, и непонятно как его можно отладить либо с остальной частью Python- кода, либо отдельно от Python- кода.
Rodegast
> Пожалуйста, не предлагайте Numa: на сегодняшний день она может очень мало

pypy не пробовал?
Sanya28
Rodegast
pypy не пробовал?

Пробовал, но он требует “рассовой чистоты” всех используемых в проекте библиотек: т.е. встретив хоть одну библиотеку, написанную на C/C++ (а не на Python), этот интерпретатор вываливается с ошибкой. Конечно, у разработчиков С/С++ библиотек есть возможность написать кучу вставок в код, чтобы PyPy их понимал, но никто этим не заморачивается. А практически все алгоритмы BigData (которые я использую в своем проекте) для ускорения уже написаны на С/С++ (и потому никто не видит смысла их оптимизировать для PyPy).

Кстати, проверил профилирование Python- кода с С/С++ вставками с помощью Vtune Amplifier- работает, но информативность результатов очень низкая. Я добавил в свой С++ код ключ комплятора -g (чтобы сохранилась отладочная инфорация), но это не спасает ситуацию: профайлер ругается на отсутствие отладочной информации у библиотeк Python.
Koala
Господа, я в этой теме не разбираюсь, но вот интересно, что про это скажут go-феристы и эрланговцы - это лучше с/c++ или да :-) ? Или таковых тут нет?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB