Зачем вам компилировать скрипт на Python? Вы можете запустить их непосредственно из файла .py, и он работает нормально, так есть ли преимущество в производительности или что-то еще?
Я также заметил, что некоторые файлы в моем приложении компилируются в .pyc, а другие нет, почему это так?
python
compilation
ryeguy
источник
источник
import mylib.py
, Python скомпилируетmylib.py
так, чтобы будущиеimport
операторы выполнялись немного быстрее. Если вы позже измените егоmylib.py
, то он будет перекомпилирован при следующем импорте (Python использует дату файла, чтобы увидеть, что это происходит.)Ответы:
Он скомпилирован в байт-код, который можно использовать намного, намного, намного быстрее.
Причина, по которой некоторые файлы не скомпилированы, заключается в том, что основной скрипт, с которым вы вызываете,
python main.py
перекомпилируется при каждом запуске скрипта. Все импортированные скрипты будут скомпилированы и сохранены на диске.Важное дополнение Бена Бланка :
источник
Файл .pyc - это Python, который уже скомпилирован в байт-код. Python автоматически запускает файл .pyc, если он находит файл с тем же именем, что и файл .py, который вы вызываете.
«Введение в Python» говорит о скомпилированных файлах Python:
Преимущество запуска файла .pyc заключается в том, что Python не требует дополнительных затрат на его компиляцию перед запуском. Поскольку Python в любом случае компилируется в байт-код перед запуском файла .py, не должно быть никакого улучшения производительности, кроме этого.
Насколько вы можете улучшить использование скомпилированных файлов .pyc? Это зависит от того, что делает скрипт. Для очень короткого сценария, который просто печатает «Hello World», компиляция может составлять большой процент от общего времени запуска и запуска. Но стоимость компиляции скрипта относительно общего времени выполнения уменьшается для скриптов с более длительным сроком действия.
Сценарий, который вы называете в командной строке, никогда не сохраняется в файл .pyc. Таким образом сохраняются только модули, загруженные этим «основным» скриптом.
источник
Достоинства:
Первое: мягкое, победное запутывание.
Второе: если компиляция приводит к значительному уменьшению файла, вы получите более быстрое время загрузки. Хорошо для Интернета.
Третье: Python может пропустить этап компиляции. Быстрее при начальной нагрузке. Хорошо для процессора и в Интернете.
В-четвертых: чем больше вы комментируете, тем меньше размер файла
.pyc
или.pyo
файла по сравнению с исходным.py
файлом.В- пятых: конечный пользователь с только
.pyc
или.pyo
файл имеет гораздо меньше шансов представить вам ошибку, вызванную необратимым изменением, о котором он забыл сообщить вам.Шестое: если вы нацелены на встроенную систему, получение файла меньшего размера для встраивания может представлять значительный плюс, а архитектура стабильна, поэтому недостаток, подробно описанный ниже, не вступает в игру.
Компиляция высшего уровня
Полезно знать, что вы можете скомпилировать исходный файл Python верхнего уровня в
.pyc
файл следующим образом:Это удаляет комментарии. Это оставляет
docstrings
нетронутым. Если вы хотите избавиться от этогоdocstrings
(вы можете серьезно задуматься о том, почему вы это делаете), то скомпилируйте этот способ вместо этого ...... и вы получите
.pyo
файл вместо.pyc
файла; одинаково распространяемый с точки зрения основной функциональности кода, но меньший по размеру вычеркнутогоdocstrings
(и менее понятный для последующей работы, если он имел приличныйdocstrings
в первую очередь). Но см. Недостаток три ниже.Обратите внимание, что python использует
.py
дату файла, если он присутствует, чтобы решить, должен ли он выполнять.py
файл в отличие от файла.pyc
или.pyo
- поэтому отредактируйте ваш файл .py, и файл.pyc
или.pyo
устарел, и все полученные преимущества будут потеряны. Вам нужно перекомпилировать его, чтобы снова.pyc
или.pyo
снова получить преимущества или выгоды, какими бы они ни были.Недостатки:
Во-первых: есть «волшебный файл cookie»
.pyc
и.pyo
файлы, которые указывают архитектуру системы, в которой был скомпилирован файл python. Если вы распространите один из этих файлов в среде другого типа, он сломается. Если вы распространяете.pyc
или.pyo
без связанного.py
для перекомпиляции илиtouch
так, он заменяет.pyc
или.pyo
, конечный пользователь также не может это исправить.Второе: если
docstrings
пропустить с использованием параметра-OO
командной строки, как описано выше, никто не сможет получить эту информацию, что может сделать использование кода более трудным (или невозможным).Третье:
-OO
опция Python также реализует некоторые оптимизации в соответствии с параметром-O
командной строки; это может привести к изменениям в работе. Известные оптимизации:sys.flags.optimize
= 1assert
заявления пропускаются__debug__
= ЛожьВ- четвертых , если вы намеренно сделали свой питон скрипт исполняемым с чем - то порядка
#!/usr/bin/python
на первой линии, это раздели в.pyc
и.pyo
файлов и функциональность теряется.Пятое: в некоторой степени очевидно, но если вы компилируете свой код, это не только может повлиять на его использование, но и возможность для других извлекать уроки из вашей работы, часто сильно.
источник
Производительность запуска скомпилированного питона увеличивается. Однако, когда вы запускаете файл .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
источник
Как уже упоминалось, вы можете получить повышение производительности от компиляции вашего кода Python в байт-код. Обычно это выполняется самим питоном, только для импортированных скриптов.
Другая причина, по которой вы можете захотеть скомпилировать свой код на python, может заключаться в защите вашей интеллектуальной собственности от копирования и / или изменения.
Вы можете прочитать больше об этом в документации по Python .
источник
Конечно, разница в производительности при запуске скомпилированного скрипта. Если вы запускаете обычные
.py
сценарии, машина компилирует их каждый раз, когда это выполняется, и на это требуется время. На современных машинах это едва заметно, но по мере роста сценария это может стать проблемой.источник
Что-то, что не затронуто, является компиляцией источника к источнику . Например,
nuitka
переводит код Python на C / C ++ и компилирует его в двоичный код, который непосредственно выполняется на ЦП, вместо байт-кода Python, который выполняется на более медленной виртуальной машине.Это может привести к значительному ускорению или позволит вам работать с Python, в то время как ваша среда зависит от кода C / C ++.
источник
Мы используем скомпилированный код для распространения среди пользователей, которые не имеют доступа к исходному коду. В основном, чтобы неопытные программисты не могли случайно что-то изменить или исправить ошибки, не сказав нам.
источник
Да, производительность - главная причина и, насколько я знаю, единственная причина.
Если некоторые из ваших файлов не компилируются, возможно, Python не сможет записать в файл .pyc, возможно, из-за прав доступа к каталогу или чего-то еще. Или, может быть, не скомпилированные файлы просто никогда не загружаются ... (скрипты / модули компилируются только при первой загрузке)
источник
Начинающие предполагают, что 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
источник