Разработка интерфейса между C++ и Python

У меня есть код для моделирования физики на C++. Я пытаюсь решить проблему управления с помощью глубокого обучения с подкреплением. Большинство популярных пакетов, таких как keras, pytorch, основаны на Python. Итак, мой код машинного обучения находится на Python, а код симулятора физики - на C++.

На каждой итерации алгоритма машинного обучения мне требуется вызов программы на C++, и я хочу, чтобы программа сохраняла свое состояние (поддерживала значения переменных). Один из способов, который я придумал, - это чтение и запись значений переменных в файлы. Но это не казалось масштабируемым, учитывая большое количество переменных в программе. Я погуглил и нашел библиотеку Boost Python для обертывания всего моего кода C++, чтобы он мог быть доступен программе Python. Мой вопрос: при этом я теряю скорость выполнения кода на C++?

Кроме того, я наткнулся на numba, который, по словам создателей, специально разработан для ускорения научных вычислений и может достигать такой же скорости, как собственный C++. Но это, по сути, означало бы переписать весь код на Python. Будет ли это лучший выбор?

Я придерживаюсь строгих сроков реализации своего проекта, и я буду очень признателен за любые советы о том, каким путем мне следует идти.

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

Henri Menke 21.11.2018 02:23

@HenriMenke Я проверю это. А как насчет скорости? Это так же быстро, как нативный C++?

Sahil Gupta 21.11.2018 02:25

Перенос не влияет на скорость кода C++. Меняется только скорость вызова кода C++. В вашем случае это может быть даже быстрее, потому что вам больше не нужно создавать оболочку.

Henri Menke 21.11.2018 02:27

Я проверил руководство на сайте SWIG. По сути, он делает то же самое, что и Boost Python. Мы создаем динамическую библиотеку и делаем ее видимой для Python. Хотя я все еще не уверен в скорости. Предположим, у нас есть код на C++ и мы проводим в нем вычисления. Теперь я оборачиваю этот код для Python. Когда я использую его в Python, не будут ли вычисления выполняться Python и медленнее по сравнению с C++?

Sahil Gupta 21.11.2018 02:31

Код C++ останется нетронутым (и, следовательно, сохранит свою производительность). Ты только добавлять интерфейс к нему. Подход Boost.Python работает аналогично SWIG, но требует написания намного большего количества кода.

Henri Menke 21.11.2018 02:48

В общем, напишите код и получите рабочее решение. Если недостаточно быстро, оптимизируйте. Обычно это будет достаточно быстро. Многие разработчики python и разработчики C++ используют python для создания точного алгоритма, а затем оптимизируют те части, которые включают львиную долю цикла и обработки.

Gardener 21.11.2018 02:49

@HenriMenke Спасибо за совет. Вы абсолютно правы. Я уже реализовал оболочку для своего кода на C++. Никогда не думал, что это будет так просто. Я экспериментировал с PyBindGen, но отсутствие хорошей документации меня очень расстраивало. С SWIG мне просто нужно было настроить базовую среду, а затем я последовательно продолжал добавлять код в модуль. Как вы и сказали, это было очень просто.

Sahil Gupta 21.11.2018 17:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
251
0

Другие вопросы по теме