Можно ли конвертировать Python-программу в C / C ++?
Мне нужно реализовать несколько алгоритмов, и я не уверен, достаточно ли большой разрыв в производительности, чтобы оправдать всю боль, которую я бы испытал, когда делал это на C / C ++ (что я не очень хорошо умею). Я подумал о том, чтобы написать один простой алгоритм и сравнить его с таким преобразованным решением. Если это само по себе значительно быстрее, чем версия Python, у меня не будет другого выбора, кроме как сделать это на C / C ++.
c++
python
c
code-generation
CrazyFlyingCloseline
источник
источник
Ответы:
Да. Посмотрите на Cython . Он делает именно это: конвертирует Python в C для ускорения.
источник
cdef
объявлений и не введете статическую типизацию (в противном случае вы просто манипулируете непрозрачнымиPyObject *
вещами). И он никогда не будет работать так же быстро, как обычный C, потому что он обычно взаимодействует с Python (100% или более - только для простого числового кода, который вообще не взаимодействует с Python в течение большей части времени!). Но кроме этого, да, это может дать вам довольно быстрое ускорение.«инвестировать» здесь не то слово.
Создайте работающую реализацию на Python. Вы закончите это задолго до того, как закончите версию C.
Измерьте производительность с помощью профилировщика Python. Исправьте любые проблемы, которые вы найдете. Измените структуры данных и алгоритмы по мере необходимости, чтобы действительно сделать это правильно. Вы закончите это задолго до того, как закончите первую версию на C.
Если это все еще слишком медленно, вручную переведите хорошо спроектированный и тщательно сконструированный Python на C.
Из-за того, как работает ретроспективный анализ, создание второй версии из существующего Python (с существующими модульными тестами и существующими данными профилирования) все равно будет быстрее, чем попытка сделать код на C с нуля.
Эта цитата важна.
источник
Shed Skin является «(ограниченным) компилятором Python-to-C ++».
источник
Просто наткнулся на этот новый инструмент в хакерских новостях.
С их страницы - «Nuitka - хорошая замена для интерпретатора Python и компилирует каждую конструкцию, которую предлагают CPython 2.6, 2.7, 3.2 и 3.3. Он переводит Python в программу на C ++, которая затем использует« libpython »для выполнения так же, как CPython делает, очень совместимым способом. "
источник
.exe
расширением для OSX, хотя это совершенно обычный исполняемый файл OSX Mach-O. Похоже , это может быть хорошей заменойpyinstaller
,py2exe
,py2app
и т.д.--recurse-***
Флаги важно установить правильно , хотя.Другой вариант - преобразовать в C ++ помимо Shed Skin - это Pythran .
Чтобы процитировать высокопроизводительный Python от Михаила Горелика и Яна Озсвальда :
источник
Я знаю, что это старая ветка, но я хотел дать полезную информацию.
Я лично использую PyPy, который очень легко установить с помощью pip. Я взаимозаменяемо использую интерпретатор Python / PyPy, вам вообще не нужно менять код, и я обнаружил, что он примерно в 40 раз быстрее, чем стандартный интерпретатор Python (либо Python 2x, либо 3x). Я использую PyCharm Community Edition для управления своим кодом, и мне это нравится.
Мне нравится писать код на python, так как я думаю, что он позволяет вам сосредоточиться на задаче больше, чем на языке, что для меня является огромным плюсом. И если вам нужно, чтобы это было еще быстрее, вы всегда можете скомпилировать в двоичный файл для Windows, Linux или Mac (не прямо, но возможно с другими инструментами). Исходя из моего опыта, я получаю примерно 3,5-кратное ускорение по сравнению с PyPy при компиляции, то есть в 140 раз быстрее, чем у Python. PyPy доступен для кода Python 3x и 2x, и снова, если вы используете IDE, такую как PyCharm, вы можете очень легко поменять местами, скажем, PyPy, Cython и Python (хотя потребуется немного первоначального изучения и настройки).
Некоторые могут поспорить со мной об этом, но я считаю, что PyPy работает быстрее, чем Cython. Но они оба отличный выбор.
Изменить: я хотел бы сделать еще одну небольшую заметку о компиляции: когда вы компилируете, результирующий двоичный файл намного больше, чем ваш скрипт Python, поскольку он встраивает в него все зависимости и т. Д. Но тогда вы получите несколько явных преимуществ: скорость !, теперь приложение будет работать на любом компьютере (в зависимости от того, для какой ОС вы скомпилировали, если не все. lol) без Python или библиотек, оно также запутывает ваш код и технически готово к производству (в некоторой степени). Некоторые компиляторы также генерируют код на C, который я на самом деле не видел и не видел, является ли он полезным или просто бессмысленным. Удачи.
Надеюсь, это поможет.
источник
Я понимаю, что ответ на совершенно новое решение отсутствует. Если в коде используется Numpy, я бы посоветовал попробовать Pythran:
http://pythran.readthedocs.io/
Для функций, которые я пробовал, Pythran дает очень хорошие результаты. Результирующие функции работают так же быстро, как хорошо написанный код на Фортране (или только немного медленнее), и немного быстрее, чем (довольно оптимизированное) решение Cython.
Преимущество по сравнению с Cython состоит в том, что вам просто нужно использовать Pythran в функции Python, оптимизированной для Numpy, а это означает, что вам не нужно расширять циклы и добавлять типы для всех переменных в цикле. Pythran не торопится, чтобы проанализировать код, чтобы он понимал операции над
numpy.ndarray
.Это также огромное преимущество по сравнению с Numba или другими проектами, основанными на своевременной компиляции, для которой (насколько мне известно) вы должны расширить циклы, чтобы быть действительно эффективными. И тогда код с циклами становится очень неэффективным, используя только CPython и Numpy ...
Недостаток Pythran: нет классов! Но поскольку компилируются только те функции, которые действительно необходимо оптимизировать, это не сильно раздражает.
Еще один момент: Pythran хорошо (и очень легко) поддерживает параллелизм OpenMP. Но я не думаю, что mpi4py поддерживается ...
источник
http://code.google.com/p/py2c/ выглядит как возможность - они также упоминают на своем сайте: Cython, Shedskin и RPython и подтверждают, что они преобразуют код Python в чистый C / C ++, который намного быстрее, чем C / C ++ пронизан вызовами API Python. Примечание: я не пробовал это, но я собираюсь ..
источник