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


можно ли конвертировать программу Python в C / C++?

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

8 102

8 ответов:

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

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

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

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

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

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

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

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

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

Билл McKeenan
Ван Институт

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

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

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

еще один вариант-конвертировать в C++ кроме Пролить Кожи - это Pythran.

цитата высокопроизводительный питон от Micha Gorelick и Ian Ozsvald:

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

одна очень интересная особенность Pythran является то, что он будет пытаться автоматическое определение возможностей распараллеливания (например, если вы используя map), и превратить это в параллельный код, не требуя дополнительной усилий от вас. Вы также можете указать параллельные секции с помощью pragma omp > директивы; в этом отношении он чувствует себя очень похоже на Цитона поддержка 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, поскольку он строит все зависимости в него и т. д. Но тогда вы получите несколько явных преимуществ: скорость! теперь приложение будет работать на любой машине (в зависимости от того, для какой ОС вы скомпилировали, если не все. лол) без Python или библиотек он также запутывает ваш код и технически готов к производству. Некоторые компиляторы также генерируют код C, который я действительно не смотрел или не видел, полезен ли он или просто тарабарщина. Удача.

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