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



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



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

1042   10  

10 ответов:

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

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

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

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

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

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

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

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

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

сценарий, который вы называете в командной строке, никогда не сохраняется в a .файл 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 file - - - поэтому отредактируйте свой файл. 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 и других.

вот интересный пост в блоге, объясняющий различия 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

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

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

Comments

    Ничего не найдено.