Насколько возможно было бы скомпилировать Python (возможно, через промежуточное представление C) в машинный код?
Предположительно, это должно быть связано с библиотекой времени выполнения Python, и любые части стандартной библиотеки Python, которые сами являются Python, также должны быть скомпилированы (и связаны).
Кроме того, вам потребуется связать интерпретатор Python, если вы хотите выполнять динамическую оценку выражений, но, возможно, подмножество Python, которое не позволяет этого, все равно будет полезно.
Обеспечит ли это какие-либо преимущества в скорости и / или использовании памяти? Предположительно, время запуска интерпретатора Python будет исключено (хотя общие библиотеки по-прежнему нуждаются в загрузке при запуске).
python
c
linker
compilation
Энди Валаам
источник
источник
Ответы:
Попробуйте компилятор ShedSkin Python-to-C ++, но он далек от совершенства. Также есть Psyco - Python JIT, если нужно только ускорение. Но ИМХО это не стоит усилий. Для критических по скорости частей кода лучшим решением было бы написать их как расширения C / C ++.
источник
Как говорит @Greg Hewgill, есть веские причины, по которым это не всегда возможно. Однако некоторые виды кода (например, очень алгоритмический код) можно превратить в «настоящий» машинный код.
Есть несколько вариантов:
После этого вы можете использовать один из существующих пакетов (freeze, Py2exe, PyInstaller), чтобы поместить все в один двоичный файл.
В общем: общего ответа на ваш вопрос нет. Если у вас есть код Python, который критичен к производительности, постарайтесь использовать как можно больше встроенных функций (или задайте вопрос «Как сделать мой код Python быстрее»). Если это не помогает, попробуйте идентифицировать код, перенести его на C (или Cython) и использовать расширение.
источник
py2c ( https://github.com/pradyun/Py2C ) может конвертировать код Python в c / c ++. Я являюсь индивидуальным разработчиком py2c.
источник
PyPy - это проект по повторной реализации Python в Python с использованием компиляции в собственный код в качестве одной из стратегий реализации (другие - это виртуальная машина с JIT, использование JVM и т. Д.). Их скомпилированные версии C в среднем работают медленнее, чем CPython, но для некоторых программ намного быстрее.
Shedskin - экспериментальный компилятор Python в C ++.
Pyrex - это язык, специально разработанный для написания модулей расширения Python. Он создан для того, чтобы преодолеть разрыв между красивым, высокоуровневым и простым в использовании миром Python и грязным низкоуровневым миром C.
источник
Nuitka - это компилятор Python для C ++, который связывается с libpython. Это относительно новый проект. Автор заявляет об улучшении скорости по сравнению с CPython на тесте pystone.
источник
На первый взгляд это может показаться разумным, однако в Python есть много обычных вещей, которые нельзя напрямую сопоставить с представлением C без переноса значительной части поддержки среды выполнения Python. Например, на ум приходит утиная печать. Многие функции в Python, которые читают ввод, могут принимать файл или подобный файлу объект, если он поддерживает определенные операции, например. read () или readline (). Если вы подумаете о том, что нужно сделать, чтобы сопоставить этот тип поддержки с C, вы начнете представлять себе именно те вещи, которые уже выполняет система времени выполнения Python.
Существуют такие утилиты, как py2exe, которые объединяют программу Python и среду выполнения в один исполняемый файл (насколько это возможно).
источник
foo.x
выражение не будет работать, потомуfoo
что не будетx
в момент его вызова. Есть ли какие-нибудь средства проверки статического кода для Python? Python можно скомпилировать в сборку .Net ...Pyrex - это подмножество языка Python, которое компилируется в C, созданное парнем, который первым построил понимание списков для Python. В основном он был разработан для создания оболочек, но может использоваться в более общем контексте. Cython - это более активно поддерживаемая ветвь pyrex.
источник
Некоторые дополнительные ссылки:
https://github.com/dropbox/pyston - JIT-компилятор для Python, разработанный Dropbox
http://pythran.readthedocs.io/ - это переводчик с Python на C ++ для научных вычислений.
https://github.com/cosmo-ethz/hope - это JIT-переводчик Python на C ++ для научных вычислений.
источник
В Jython есть компилятор, ориентированный на байт-код JVM. Байт-код полностью динамичен, как и сам язык Python! Очень круто. (Да, как указывает ответ Грега Хьюгилла, байт-код действительно использует среду выполнения Jython, поэтому файл jython jar должен распространяться вместе с вашим приложением.)
источник
Psyco - это своего рода JIT-компилятор: динамический компилятор для Python, запускает код в 2-100 раз быстрее, но требует много памяти.
Вкратце: он запускает ваше существующее программное обеспечение Python намного быстрее, без изменений в вашем исходном коде, но он не компилируется в объектный код так, как это сделал бы компилятор C.
источник
Ответ: «Да, это возможно». Вы можете взять код Python и попытаться скомпилировать его в эквивалентный код C, используя CPython API. На самом деле, раньше был проект Python2C, который делал именно это, но я не слышал о нем много лет (еще во времена Python 1.5 я видел его в последний раз).
Вы можете попытаться перевести код Python на собственный язык C, насколько это возможно, и вернуться к API CPython, когда вам понадобятся реальные функции Python. Я сам обдумывал эту идею последние месяц или два. Однако это ужасно много работы, и огромное количество функций Python очень сложно перевести на C: вложенные функции, генераторы, что угодно, кроме простых классов с простыми методами, все, что связано с изменением глобальных объектов модуля извне модуля и т. Д. , и т.д.
источник
Это не компилирует Python в машинный код. Но позволяет создать общую библиотеку для вызова кода Python.
Если то, что вы ищете, - это простой способ запустить код Python из C, не полагаясь на материал execp. Вы можете создать общую библиотеку из кода Python, обернутого несколькими вызовами API встраивания Python . Приложение представляет собой разделяемую библиотеку, поэтому вы можете использовать ее во многих других библиотеках / приложениях.
Вот простой пример создания общей библиотеки, которую вы можете связать с программой C. Общая библиотека выполняет код Python.
Будет выполнен файл python
pythoncalledfromc.py
:Вы можете попробовать
python2 -c "import pythoncalledfromc; pythoncalledfromc.main('HELLO')
. Он выведет:Общая библиотека будет определяться следующим образом
callpython.h
:Связано
callpython.c
это:Вы можете скомпилировать его с помощью следующей команды:
Создайте файл с именем,
callpythonfromc.c
который содержит следующее:Скомпилируйте и запустите:
Это очень простой пример. Это может работать, но в зависимости от библиотеки может быть все еще сложно сериализовать структуры данных C в Python и с Python на C. Все можно несколько автоматизировать ...
Нуитка может быть полезна.
Также есть нумба, но они оба не стремятся делать именно то, что вы хотите. Создание заголовка C из кода Python возможно, но только если вы укажете, как преобразовать типы Python в типы C, или можете вывести эту информацию. См. Python astroid для анализа Python ast.
источник