Подтвердить что ты не робот

Зачем компилировать код Python?

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

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

4b9b3361

Ответ 1

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

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

Важное дополнение Ben Blank:

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

Ответ 2

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

"Введение в Python" говорит об этом в файле с компиляцией Python:

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

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

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

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

Ответ 3

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

Во-первых: умеренная, поразительная обфускация.

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

В-третьих: 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, например, они могут быть.

Недостатки:

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

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Начинающие предполагают, что 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