Конвертировать программу Python в код C / C++? [закрытый]

можно ли преобразовать программу Python в c/" class="blnk">C/C++?

Мне нужно реализовать пару алгоритмов, и я не уверен, что разрыв в производительности достаточно велик, чтобы оправдать всю боль, которую я прошел бы, делая это на C/C++ (что я не очень хорошо). Я подумал о том, чтобы написать один простой алгоритм и сравнить его с таким преобразованным решением. Если только это значительно быстрее, чем версия Python, то у меня не будет другого выбора, кроме как делать это на C/C++.

8 ответов


да. Посмотреть на Cython. Он делает именно это: преобразует Python в C для ускорения.


Если вариант C требует x часов меньше, то я бы инвестировал это время в то, чтобы алгоритмы работали дольше / снова

"инвестировать" здесь не то слово.

  1. создайте рабочую реализацию в Python. Вы закончите это задолго до того, как закончите версию C.

  2. измерьте производительность с помощью профилировщика Python. Исправьте любые проблемы, которые вы найдете. Изменение структур данных и алгоритмов по мере необходимости это правильно. Вы закончите это задолго до того, как закончите первую версию в C.

  3. если он все еще слишком медленный, вручную переведите хорошо спроектированный и тщательно построенный Python в C.

    из-за того, как работает ретроспектива, выполнение второй версии из существующего Python (с существующими модульными тестами и с существующими данными профилирования) все равно будет быстрее, чем попытка сделать код C с нуля.

эта цитата важный.

Томпсон для создателей телескопа
Быстрее сделать четырехдюймовое зеркало, а затем шестидюймовое зеркало, чем сделать шестидюймовое зеркало.

Билл McKeenan
Wang Institute


Пролить Кожи является"(ограниченным) компилятором Python-to-C++".


только что наткнулся этой новый инструмент в hacker news.

со своей страницы - "Nuitka является хорошей заменой интерпретатора Python и компилирует каждую конструкцию, которую предлагают CPython 2.6, 2.7, 3.2 и 3.3. Он переводит Python в программу на C++, которая затем использует "libpython" для выполнения так же, как CPython, очень совместимым образом."


другой вариант - конвертировать в C++, кроме Пролить Кожи - is Pythran.

цитата высокая производительность Python от Михи Горелицк и Ян Ozsvald:

Pythran-это компилятор Python-to-C++ для подмножества Python, который включает частичное numpy поддержка. Он действует немного как Numba и Cython-вы аннотируете аргументы функции, а затем она берет на себя с дальнейшим типом аннотации и специализацией кода. Это занимает преимущество возможностей векторизации и OpenMP-based возможности распараллеливания. Он работает только с Python 2.7.

одна очень интересная особенность Pythran заключается в том, что он попытается автоматическое определение возможностей распараллеливания (например, если вы с помощью map), и превратить это в параллельный код, не требуя дополнительной усилий от вас. Вы также можете указать параллельные разделы, используя pragma omp > директивы; в этом отношении она очень чувствует аналогично на Cython это поддержка OpenMP.

за кулисами Pythran будет принимать как обычный код Python, так и код numpy и попытаться агрессивно скомпилировать их в очень быстрый C++ - даже быстрее, чем результаты Цитона.

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


http://code.google.com/p/py2c/ похоже на возможность - они также упоминают на своем сайте: Cython, Shedskin и RPython и подтверждают, что они преобразуют код Python в чистый C/C++, который намного быстрее, чем C/C++, пронизанный вызовами API Python. Примечание: Я не пробовал, но собираюсь..


Я понимаю, что ответ на совершенно новое решение отсутствует. Если Numpy используется в коде, я бы посоветовал попробовать Pythran:

http://pythran.readthedocs.io/

для функций, которые я пробовал, Pythran дает очень хорошие результаты. Полученные функции так же быстро, как и написанный код Fortran (или только немного медленнее) и немного быстрее, чем (довольно оптимизированное) решение Cython.

преимущество сравненное к Cython что вы просто нужно использовать Pythran в функции Python, оптимизированной для Numpy, что означает, что вам не нужно расширять циклы и добавлять типы для всех переменных в цикле. Pythran не торопится анализировать код, чтобы понять операции на numpy.ndarray.

это также огромное преимущество по сравнению с Numba или другими проектами, основанными на компиляции just-in-time, для которой (насколько мне известно) вам нужно расширить циклы, чтобы быть действительно эффективными. И тогда код с петлями становится очень очень неэффективно использовать только CPython и Numpy...

недостаток Pythran: нет классов! Но поскольку компилировать нужно только те функции, которые действительно нужно оптимизировать, это не очень раздражает.

другой момент: Pythran поддерживает хорошо (и очень легко) параллелизм OpenMP. Но я не думаю, что mpi4py поддерживается...


Я знаю, что это старая тема, но я хотел дать то, что я думаю, чтобы быть полезной информацией.

Я лично использую PyPy, который очень прост в установке с помощью pip. Я взаимозаменяемо использую интерпретатор Python/PyPy, вам вообще не нужно менять свой код, и я обнаружил, что он примерно в 40 раз быстрее, чем стандартный интерпретатор python (либо Python 2x, либо 3x). Я использую pyCharm Community Edition для управления моим кодом, и мне это нравится.

Мне нравится писать код на Python, как я думаю, это позволяет вам сосредоточиться больше на задаче, чем на языке, что является огромным плюсом для меня. И если вам нужно, чтобы он был еще быстрее, вы всегда можете скомпилировать его в двоичный файл для Windows, Linux или Mac. По моему опыту, я получаю около 3.5 x ускорение над PyPy при компиляции, что означает 140x быстрее, чем python. PyPy доступен для кода Python 3x и 2x, и снова, если вы используете IDE, такую как PyCharm, вы можете очень легко обмениваться между PyPy, Cython и Python (требуется немного начального обучения).

некоторые люди могут спорить со мной по этому поводу, но я считаю, что Пайпи быстрее, чем Цитон. Хотя они оба отличный выбор.

Edit: Я хотел бы сделать еще одно краткое замечание о компиляции: когда вы компилируете, результирующий двоичный файл намного больше, чем ваш скрипт python, поскольку он строит все зависимости в него и т. д. Но тогда вы получаете несколько явных преимуществ: скорость!, теперь приложение будет работать на любой машине (в зависимости от того, для какой ОС вы скомпилировали, если не все. lol) без Python или библиотек он также запутывает ваш код и технически "готов к производству". Некоторые компиляторы также генерируют код C, который я действительно не смотрел или не видел, полезен ли он или просто тарабарщина. Удача.

надеюсь, это поможет.