Запуск кода на C ++ вместе с Python и взаимодействие с ним - PullRequest
3 голосов
/ 01 июня 2011

Итак, мой текущий проект в основном на Python, но я собираюсь переписать наиболее дорогостоящие на C ++ части в вычислительном отношении, чтобы попытаться повысить производительность. Многое из этого я могу достичь с помощью простых функций, загружаемых из файлов DLL, но не всего. У меня есть многомерный массив в Python, с которым я хочу выполнять операции в C ++ (в частности, A * pathfinding), но я не совсем уверен, как их переводить, и постоянная отправка данных по одному фрагменту за раз в загруженную функцию кажется действительно неэффективно (первые два измерения массива находятся в младших сотнях, и функции должны будут иметь дело с десятками, если не сотнями, элементов в массиве за один раз).

Моя идея заключалась в том, чтобы иметь класс в C ++, который создает свою собственную копию массива при настройке (где производительность не столь важна) и имеет методы, которые выполняются над массивом и возвращают данные в основной Python программа. Тем не менее, я не уверен, как это сделать, и даже если это правильный путь для такой вещи; Казалось бы, это означает, что код C ++ работает параллельно основной программе на Python, а интуиция подсказывает мне, что это плохая идея.

Я мало что знаю об интеграции C ++ и Python, за исключением того, как загружать простые функции через cTypes в Python, поэтому я очень ценю некоторые указатели здесь. Имейте в виду, что я относительно новичок в C ++; большая часть моего опыта программирования на Python. Каков наилучший способ совместить их в этой ситуации?

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Прежде всего, когда вы работаете с многомерными массивами в Python, вы действительно должны использовать NumPy .Скорее всего, ваша программа уже достаточно быстра, когда вы позволяете NumPy выполнять вычисления чисел (используйте арифметику Array вместо циклов Python for).

Если этого недостаточно, подумайте о написании частей вашей программы с использованием Cython .Cython также поддерживает массивы NumPy и предоставляет безболезненный способ написания кода C с использованием Python-подобного синтаксиса.

Если это действительно должен быть C ++, я настоятельно рекомендую использовать Boost.Python .Соединить Python и C ++ никогда не было так просто.Кроме того, Boost.Python также поддерживает NumPy (boost::numeric::array).

0 голосов
/ 01 июня 2011

Взгляните на Cython .

...