Преобразование программы Python в код C / C ++?

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

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

Да. Посмотрите на Китона . Он делает именно это: конвертирует Python в C для ускорения.

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

«Инвестировать» – это не то слово здесь.

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

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

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

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

Эта цитата важна.

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

Билл МакКинан
Институт Ванга

Shed Skin – это «ограниченный» компилятор Python-to-C ++ ».

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

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

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

Другой вариант – конвертировать в C ++, кроме Shed Skin, – это Pythran .

Чтобы процитировать High Performance Python от Micha Gorelick и Ian Ozsvald :

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

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

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

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

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

http://pythonhosted.org/pythran/

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

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

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

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

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

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

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

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

Некоторые люди могут спорить со мной по этому поводу, но я считаю, что PyPy будет быстрее, чем Cython. Тем не менее, они оба отличные варианты.

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

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