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

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

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

Ответ 1

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

Ответ 2

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

"инвестировать" здесь не самое подходящее слово.

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

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

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

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

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

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

Билл МакКинан

Институт Ванга

Ответ 3

Shed Skin является "(ограниченным) компилятором Python-to-С++".

Ответ 4

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

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

Ответ 5

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

Чтобы процитировать высокопроизводительный Python от Михаила Горелика и Яна Озсвальда:

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

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

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

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

Ответ 6

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

Ответ 7

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

http://pythran.readthedocs.io/

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

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

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

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

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

Ответ 8

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

Я лично использую 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-код, который я на самом деле не видел и не видел, полезен ли он или просто бред. Удачи.

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