Преобразовать программу Python в код C/C++?
Можно ли конвертировать Python-программу в C/C++?
Мне нужно реализовать несколько алгоритмов, и я не уверен, достаточно ли большой разрыв в производительности, чтобы оправдать всю боль, которую я бы испытал, когда делал это на C/C++ (что я не очень хорошо умею). Я подумал о том, чтобы написать один простой алгоритм и сравнить его с таким преобразованным решением. Если это само по себе значительно быстрее, чем версия Python, у меня не будет другого выбора, кроме как сделать это на C/C++.
9 ответов
Да. Посмотрите на Cython. Это делает только это: Конвертирует Python в C для ускорения.
Если для варианта C требуется х часов меньше, я бы потратил это время на то, чтобы алгоритмы работали дольше / снова
"инвестировать" здесь не то слово.
Создайте работающую реализацию в 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 делает, очень совместимым способом. "
Я знаю, что это старая ветка, но я хотел дать полезную информацию.
Я лично использую 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, который я на самом деле не видел и не видел, является ли он полезным или просто бессмысленным. Удачи.
Надеюсь, это поможет.
Другой вариант - преобразовать в C++ помимо Shed Skin - это Pythran.
Чтобы процитировать высокопроизводительный Python от Михаэля Горелика и Яна Озсвальда:
Pythran - это компилятор Python-to-C++ для подмножества Python, включающего частичное
numpy
служба поддержки. Он действует немного как Numba и Cython - вы аннотируете аргументы функции, а затем вступаете во владение с дальнейшей аннотацией типа и специализацией кода. Он использует возможности векторизации и возможности распараллеливания на основе OpenMP. Он работает только на Python 2.7.Одна очень интересная особенность Pythran заключается в том, что он попытается автоматически определить возможности распараллеливания (например, если вы используете
map
) и превратить это в параллельный код, не требуя от вас дополнительных усилий. Вы также можете указать параллельные секции, используяpragma omp
> директивы; в этом отношении он очень похож на поддержку OpenMP в Cython.За кулисами Pythran возьмет как обычный Python, так и код numpy и попытается агрессивно скомпилировать их в очень быстрый C++ - даже быстрее, чем результаты Cython.
Вы должны отметить, что этот проект молодой, и вы можете столкнуться с ошибками; Вы также должны отметить, что команда разработчиков очень дружелюбна и, как правило, исправляет ошибки в считанные часы.
http://code.google.com/p/py2c/ выглядит как возможность - они также упоминают на своем сайте: Cython, Shedskin и RPython и подтверждают, что они преобразуют код Python в чистый C / C++, который намного быстрее, чем C / C++ пронизан вызовами API Python. Примечание: я не пробовал это, но я собираюсь..
Я понимаю, что ответ на совершенно новое решение отсутствует. Если в коде используется Numpy, я бы посоветовал попробовать Pythran:
http://pythran.readthedocs.io/
Для функций, которые я пробовал, Pythran дает очень хорошие результаты. Результирующие функции работают так же быстро, как хорошо написанный код на Фортране (или только немного медленнее), и немного быстрее (довольно оптимизированного) решения Cython.
Преимущество по сравнению с Cython заключается в том, что вам просто нужно использовать Pythran в функции Python, оптимизированной для Numpy, а это означает, что вам не нужно расширять циклы и добавлять типы для всех переменных в цикле. Pythran не торопится, чтобы проанализировать код, чтобы он понимал операции на numpy.ndarray
,
Это также огромное преимущество по сравнению с Numba или другими проектами, основанными на своевременной компиляции, для которой (насколько мне известно) вы должны расширить циклы, чтобы быть действительно эффективными. И тогда код с циклами становится очень неэффективным, используя только CPython и Numpy...
Недостаток Pythran: нет классов! Но поскольку компилируются только те функции, которые действительно необходимо оптимизировать, это не сильно раздражает.
Еще один момент: Pythran хорошо (и очень легко) поддерживает параллелизм OpenMP. Но я не думаю, что mpi4py поддерживается...
Чаще всего невозможно преобразовать достаточно хороший код Python в также хороший код C++. Это невозможно сделать с помощью автоматических инструментов, и выполнение этого вручную в большинстве случаев означает повторное написание этого кода на C++.
Причина в том, что C++ - это не ассемблер. Этот язык поддерживает множество шаблонов проектирования и ожидает, что разработчики будут их использовать. При использовании этих шаблонов он остается читаемым, продуктивным и достаточно быстрым.
У Python тоже есть свои шаблоны проектирования, но они очень разные. Слишком разные, чтобы можно было легко переписать.
Представьте, что у вас есть большой массив структур с 11 именованными полями типа float, и вам нужно проделать с ними различную работу. В Python это всегда будет numpy.array. Он будет полон таких конструкций, как np.where, np.arange и т.п.
Иначе говоря, C++ предоставит структуру с именованными полями, обращаясь к ним напрямую. Из этой структуры может быть создан класс, предоставляющий некоторые методы и инкапсуляции. Вероятно, циклы будут использоваться для итерации по всем структурам, но там, где это необходимо (например, для компаратора сортировки), замыкания будут использоваться для объединения специализированного поведения со стандартным алгоритмом. Этот код не будет похож на код Python.
Кроме того, если в коде Python используется какая-либо нетривиальная библиотека, может быть сложно или невозможно найти прямую замену, если только библиотека Python на самом деле не является библиотекой C++ с привязками только к Python. Возможно, вам также придется переписать библиотеку или, по крайней мере, те части, которые вы используете.
В результате тщательное отслеживание некоторого прототипа Python требует больше, а не меньше времени на программирование. То, чем вы хотите быть на C++, пишите на C++ с нуля.