У меня есть код для моделирования физики на C++. Я пытаюсь решить проблему управления с помощью глубокого обучения с подкреплением. Большинство популярных пакетов, таких как keras, pytorch, основаны на Python. Итак, мой код машинного обучения находится на Python, а код симулятора физики - на C++.
На каждой итерации алгоритма машинного обучения мне требуется вызов программы на C++, и я хочу, чтобы программа сохраняла свое состояние (поддерживала значения переменных). Один из способов, который я придумал, - это чтение и запись значений переменных в файлы. Но это не казалось масштабируемым, учитывая большое количество переменных в программе. Я погуглил и нашел библиотеку Boost Python для обертывания всего моего кода C++, чтобы он мог быть доступен программе Python. Мой вопрос: при этом я теряю скорость выполнения кода на C++?
Кроме того, я наткнулся на numba, который, по словам создателей, специально разработан для ускорения научных вычислений и может достигать такой же скорости, как собственный C++. Но это, по сути, означало бы переписать весь код на Python. Будет ли это лучший выбор?
Я придерживаюсь строгих сроков реализации своего проекта, и я буду очень признателен за любые советы о том, каким путем мне следует идти.
@HenriMenke Я проверю это. А как насчет скорости? Это так же быстро, как нативный C++?
Перенос не влияет на скорость кода C++. Меняется только скорость вызова кода C++. В вашем случае это может быть даже быстрее, потому что вам больше не нужно создавать оболочку.
Я проверил руководство на сайте SWIG. По сути, он делает то же самое, что и Boost Python. Мы создаем динамическую библиотеку и делаем ее видимой для Python. Хотя я все еще не уверен в скорости. Предположим, у нас есть код на C++ и мы проводим в нем вычисления. Теперь я оборачиваю этот код для Python. Когда я использую его в Python, не будут ли вычисления выполняться Python и медленнее по сравнению с C++?
Код C++ останется нетронутым (и, следовательно, сохранит свою производительность). Ты только добавлять интерфейс к нему. Подход Boost.Python работает аналогично SWIG, но требует написания намного большего количества кода.
В общем, напишите код и получите рабочее решение. Если недостаточно быстро, оптимизируйте. Обычно это будет достаточно быстро. Многие разработчики python и разработчики C++ используют python для создания точного алгоритма, а затем оптимизируют те части, которые включают львиную долю цикла и обработки.
@HenriMenke Спасибо за совет. Вы абсолютно правы. Я уже реализовал оболочку для своего кода на C++. Никогда не думал, что это будет так просто. Я экспериментировал с PyBindGen, но отсутствие хорошей документации меня очень расстраивало. С SWIG мне просто нужно было настроить базовую среду, а затем я последовательно продолжал добавлять код в модуль. Как вы и сказали, это было очень просто.






Чтобы быстро связать существующий код с Python, я рекомендую SWIG. На их веб-сайте также есть краткое руководство: swig.org/tutorial.html