Конвертировать программу Python в код C / C++? [закрытый]
можно ли преобразовать программу Python в c/" class="blnk">C/C++?
Мне нужно реализовать пару алгоритмов, и я не уверен, что разрыв в производительности достаточно велик, чтобы оправдать всю боль, которую я прошел бы, делая это на C/C++ (что я не очень хорошо). Я подумал о том, чтобы написать один простой алгоритм и сравнить его с таким преобразованным решением. Если только это значительно быстрее, чем версия Python, то у меня не будет другого выбора, кроме как делать это на C/C++.
8 ответов
да. Посмотреть на Cython. Он делает именно это: преобразует Python в C для ускорения.
Если вариант C требует x часов меньше, то я бы инвестировал это время в то, чтобы алгоритмы работали дольше / снова
"инвестировать" здесь не то слово.
создайте рабочую реализацию в Python. Вы закончите это задолго до того, как закончите версию C.
измерьте производительность с помощью профилировщика Python. Исправьте любые проблемы, которые вы найдете. Изменение структур данных и алгоритмов по мере необходимости это правильно. Вы закончите это задолго до того, как закончите первую версию в C.
-
если он все еще слишком медленный, вручную переведите хорошо спроектированный и тщательно построенный Python в C.
из-за того, как работает ретроспектива, выполнение второй версии из существующего Python (с существующими модульными тестами и с существующими данными профилирования) все равно будет быстрее, чем попытка сделать код C с нуля.
эта цитата важный.
Томпсон для создателей телескопа
Быстрее сделать четырехдюймовое зеркало, а затем шестидюймовое зеркало, чем сделать шестидюймовое зеркало.Билл McKeenan
Wang Institute
только что наткнулся этой новый инструмент в 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, который я действительно не смотрел или не видел, полезен ли он или просто тарабарщина. Удача.
надеюсь, это поможет.