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

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

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

10 ответов


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

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

важное дополнение к Бен Пустой:

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


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

"введение в Python" говорит Это О скомпилированных файлах Python:

программа не работает быстрее, когда это читается из "а".pyc 'or'.Пе’ файл, чем когда он читается из a ‘.py’ файл; единственное, что быстрее о.‘ pyc 'or'.файлы гнойно-это скорость, с которой они загружаются.

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

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

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


плюсы:

во-первых: слабое, побеждаемое запутывание.

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

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

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

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

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

верхний уровень сборник

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

python -m py_compile myscript.py

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

python -OO -m py_compile myscript.py

...и ты получишь вместо .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 также реализует некоторые оптимизации в соответствии с -O опция командной строки; это может привести к изменения в работе. Известные оптимизации:

  • sys.flags.optimize = 1
  • assert высказывания пропускаются
  • __debug__ = False

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

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


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

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

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

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


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


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

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

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


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


да, производительность является основной причиной и, насколько я знаю, Единственная причина.

Если некоторые из ваших файлов не компилируются, возможно, 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


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

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