Зачем компилировать код Python? - PullRequest
224 голосов
/ 23 января 2009

Зачем вам компилировать скрипт Python? Вы можете запустить их непосредственно из файла .py, и он работает нормально, так есть ли преимущество в производительности или что-то еще?

Я также заметил, что некоторые файлы в моем приложении компилируются в .pyc, а другие нет, почему это так?

Ответы [ 10 ]

246 голосов
/ 23 января 2009

Он скомпилирован в байт-код, который можно использовать намного, намного, намного быстрее.

Причина, по которой некоторые файлы не скомпилированы, заключается в том, что основной скрипт, который вы вызываете с помощью python main.py, перекомпилируется при каждом запуске скрипта. Все импортированные скрипты будут скомпилированы и сохранены на диске.

Важное дополнение Бен Бланк :

Стоит отметить, что во время запуска скомпилированный скрипт имеет более быстрый запуск время (как это не должно быть скомпилировано), не запускается быстрее.

75 голосов
/ 23 января 2009

.pyc-файл - это Python, который уже скомпилирован в байт-код. Python автоматически запускает файл .pyc, если он находит файл с тем же именем, что и файл .py, который вы вызываете.

«Введение в Python» говорит о скомпилированных файлах Python:

Программа не работает быстрее, когда это читается из «.pyc» или «.pyo» файла, чем когда он читается из .py файл; единственное, что быстрее о файлах ".pyc" или ".pyo" скорость, с которой они загружаются.

Преимущество запуска файла .pyc заключается в том, что Python не требует затрат на его компиляцию перед запуском. Поскольку Python в любом случае компилируется в байт-код перед запуском файла .py, не должно быть никакого улучшения производительности, кроме этого.

Насколько вы можете улучшить использование скомпилированных файлов .pyc? Это зависит от того, что делает скрипт. Для очень короткого сценария, который просто печатает «Hello World», компиляция может составлять большой процент от общего времени запуска и запуска. Но затраты на компиляцию сценария относительно общего времени выполнения уменьшаются для более длительных сценариев.

Сценарий, который вы называете в командной строке, никогда не сохраняется в файл .pyc. Таким образом сохраняются только модули, загруженные этим «основным» скриптом.

46 голосов
/ 24 апреля 2014

Достоинства:

Первое: легкое, победное запутывание.

Второе: если в результате компиляции будет значительно меньший файл, вы получите более быстрое время загрузки. Хорошо для сети.

Третье: Python может пропустить этап компиляции. Быстрее при начальной нагрузке. Хорошо для процессора и Интернета.

В-четвертых: чем больше вы комментируете, тем меньше размер файла .pyc или .pyo по сравнению с исходным файлом .py.

Пятое: у конечного пользователя, имеющего только файл .pyc или .pyo, гораздо меньше шансов представить вам ошибку, вызванную необратимым изменением, о котором он забыл сообщить.

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

Компиляция верхнего уровня

Полезно знать, что вы можете скомпилировать исходный файл Python верхнего уровня в файл .pyc следующим образом:

python -m py_compile myscript.py

Это удаляет комментарии. Оставляет docstrings нетронутыми. Если вы хотите избавиться и от docstrings (возможно, вы захотите серьезно подумать о том, почему вы это делаете), вместо этого скомпилируйте этот способ ...

python -OO -m py_compile myscript.py

... и вы получите файл .pyo вместо файла .pyc; одинаково распространяемый с точки зрения основной функциональности кода, но меньший по размеру вычеркнутого docstrings (и менее понятный для последующего использования, если он имел приличный docstrings во-первых). Но см. Недостаток три ниже.

Обратите внимание, что python использует дату файла .py, если он присутствует, чтобы решить, должен ли он выполнять файл .py в отличие от файла .pyc или .pyo - так что отредактируйте ваш .py файл, .pyc или .pyo устарели, и все полученные вами преимущества будут потеряны. Вам необходимо перекомпилировать его, чтобы снова получить преимущества .pyc или .pyo, какими бы они ни были.

Недостатки:

Во-первых: в файлах .pyc и .pyo есть «волшебное печенье», которое указывает на архитектуру системы, в которую был скомпилирован файл python. Если вы распространите один из этих файлов в среде другого типа, он перерыв. Если вы распространяете .pyc или .pyo без связанного .py для перекомпиляции или touch, чтобы он заменял .pyc или .pyo, конечный пользователь не может исправить это либо.

Второе: если docstrings пропущено с использованием параметра командной строки -OO, как описано выше, никто не сможет получить эту информацию, что может сделать использование кода более трудным (или невозможным). )

В-третьих: опция Python -OO также реализует некоторые оптимизации в соответствии с параметром командной строки -O; это может привести к изменениям в работе. Известные оптимизации:

  • sys.flags.optimize = 1
  • assert операторы пропускаются
  • __debug__ = Ложь

В-четвертых: если вы намеренно сделали свой скрипт Python исполняемым с чем-то порядка #!/usr/bin/python в первой строке, это удаляется в файлах .pyc и .pyo и эта функциональность теряется.

Пятое: отчасти очевидно, но если вы скомпилируете свой код, это не только повлияет на его использование, но и уменьшит вероятность того, что другие смогут извлечь пользу из вашей работы, часто очень серьезно.

9 голосов
/ 23 января 2009

Производительность запуска скомпилированного питона увеличивается. Однако, когда вы запускаете файл .py как импортированный модуль, python скомпилирует и сохранит его, и пока файл .py не изменится, он всегда будет использовать скомпилированную версию.

При использовании любого интерпретируемого языка при использовании файла процесс выглядит примерно так:
1. Файл обрабатывается интерпретатором.
2. Файл скомпилирован
3. Скомпилированный код выполнен.

очевидно, что с помощью предварительно скомпилированного кода вы можете исключить шаг 2, это касается python, PHP и других.

Вот интересное сообщение в блоге, объясняющее различия http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
И вот запись, которая объясняет процесс компиляции Python http://effbot.org/zone/python-compile.htm

8 голосов
/ 23 января 2009

Как уже упоминалось, вы можете получить повышение производительности от компиляции вашего кода Python в байт-код. Обычно это выполняется самим питоном, только для импортированных скриптов.

Еще одна причина, по которой вы можете захотеть скомпилировать код на python, - защита вашей интеллектуальной собственности от копирования и / или изменения.

Подробнее об этом можно прочитать в документации Python .

7 голосов
/ 23 января 2009

Конечно, разница в производительности при запуске скомпилированного скрипта. Если вы запускаете обычные .py сценарии, машина компилирует их каждый раз, когда запускается, и это занимает время. На современных машинах это едва заметно, но по мере роста сценария это может стать проблемой.

4 голосов
/ 23 декабря 2017

Что-то, что не затронуто, является от источника к источнику компиляции . Например, nuitka преобразует код Python в C / C ++ и компилирует его в двоичный код, который выполняется непосредственно на ЦП, вместо байт-кода Python, который выполняется на более медленной виртуальной машине.

Это может привести к значительному ускорению или позволить вам работать с Python, в то время как ваша среда зависит от кода C / C ++.

4 голосов
/ 15 июня 2015

Мы используем скомпилированный код для распространения среди пользователей, которые не имеют доступа к исходному коду. В основном, чтобы неопытные программисты не могли случайно что-то изменить или исправить ошибки, не сказав нам.

2 голосов
/ 23 января 2009

Да, производительность - это главная причина и, насколько я знаю, единственная причина.

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

1 голос
/ 08 января 2014

Начинающие предполагают, что Python компилируется из-за файлов .pyc. Файл .pyc - это скомпилированный байт-код, который затем интерпретируется. Так что, если вы уже запустили свой код Python и имеете под рукой файл .pyc, он будет работать быстрее во второй раз, так как не нужно пересобирать байт-код

составитель: Компилятор - это кусок кода, который переводит язык высокого уровня на машинный язык

Переводчики: Переводчики также преобразуют язык высокого уровня в машиночитаемые двоичные эквиваленты. Каждый раз, когда интерпретатор получает код языка высокого уровня для выполнения, он преобразует код в промежуточный код перед преобразованием его в машинный код. Каждая часть кода интерпретируется и затем выполняется по отдельности в последовательности, и в части кода обнаруживается ошибка, которая прекратит интерпретацию кода без перевода следующего набора кодов.

Источники: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...