Вопрос

Мне дали, чтобы понять, что Python - это интерпретированный язык ... однако, когда я смотрю на свой исходный код Python, я вижу .pyc Файлы, которые Windows идентифицирует как «скомпилированные файлы Python». Куда они входят?

Это было полезно?

Решение

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

Документация Python объясняет определение следующим образом:

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

Другие советы

Мне дали, чтобы понять, что Python - это интерпретированный язык ...

Этот популярный мем неверен или, скорее, построен из -за недопонимания (естественных) языковых уровней: аналогичная ошибка - сказать «Библия - это книга в твердом переплете». Позвольте мне объяснить это сравнение ...

«Библия» - это «книга» в смысле быть учебный класс (фактические, физические объекты, идентифицированные как) книги; Предполагается, что книги, определенные как «копии Библии», имеют что -то общее (содержание, хотя даже они могут быть на разных языках, с различными приемлемыми переводами, уровнями сносок и других аннотаций) - однако эти книги являются совершенно хорошо разрешено различаться по множеству аспектов, которые нет Считается фундаментальным - своего рода привязкой, цвет связывания, шрифты (ы), используемые в печати, иллюстрации, если таковые имеются, широкие поля с записи или нет, цифры и виды строительных закладок, и так далее, и так далее.

Вполне возможно, что типичный Печать Библии действительно будет в привязке в твердом переплете-в конце концов, это книга, которая обычно предназначена для чтения снова и снова, вкладывается в несколько мест, пробивалась в поисках данных указателей и т. Д. и т. Д. Хорошее привязки в твердом переплете может сделать данную копию дольше при таком использовании. Тем не менее, это мирские (практические) проблемы, которые нельзя использовать для определения того, является ли данным фактическим книжным объектом копией Библии или нет: печать в мягкой обложке вполне возможны!

Точно так же Python - это «язык» в смысле определения класса язык реализации все это должно быть схожим в некоторых фундаментальных отношениях (синтаксис, большинство семантики, кроме тех, где им явно разрешено различаться), но им полностью разрешено различаться практически во всех деталях «реализации», включая то, как они имеют дело с исходные файлы, которые они даны, составляют ли они источники в некоторые формы более низкого уровня (и, если да, какая форма - и сохраняют ли они такие составленные формы, на диск или в другом месте), как они выполняют указанные формы и т. Д. Анкет

Классическая реализация, CPYTHON, часто называют просто «Python» для краткости, но это лишь одна из нескольких реализаций по производству качества, бок о бок с Microsoft Ironpython (которая компилируется для CLR-кодов, то есть «.net»), Jython (Что компилируется для кодов JVM), Pypy (который написан в самом Python и может компилировать огромное разнообразие «внутренних» форм, в том числе «простое время», генерируемого машинного языка). Они все Python (== "реализации языка питона"), как и многие поверхностно разные объекты книги могут быть Библии (== "Копии Библии").

Если вам конкретно заинтересован в CPYTHON: он компилирует исходные файлы в форму нижнего уровня, специфичную для Python (известный как «Bytecode»), делает это автоматически, когда это необходимо (когда нет файла Bytecode, соответствующего исходному файлу, или Файл Bytecode старше источника или составлен с другой версией Python), обычно сохраняет файлы Bytecode на диск (чтобы избежать их перекомпиляции в будущем). OTOH Ironpython обычно компилируется в коды CLR (сохранение их на диск или нет, в зависимости от кодов JVM (сохранение их на диск или нет - он будет использовать .class Расширение, если это сохраняет их).

Эти формы более низкого уровня затем выполняются подходящими «виртуальными машинами», также известными как «переводчики» - VM CPYTHON, в зависимости от времени .NET .NET, VM Java (AKA JVM).

Итак, в этом смысле (что делают типичные реализации), Python - это «интерпретированный язык», если и только тогда, когда C# и Java: все они имеют типичную стратегию реализации сначала производства байт -кода, затем выполнение через виртуальную машину/интерпретатор Анкет

Скорее всего, сосредоточено на том, насколько «тяжелая», медленная и высокая кремония процесс компиляции. CPYTHON предназначен для того, чтобы компилировать максимально быстро, максимально легкую, с максимально небольшой церемонией, насколько это возможно - компилятор делает очень небольшую проверку ошибок и оптимизацию, поэтому он может работать быстро и в небольших количествах памяти, что, в свою очередь, позволяет ему Будьте автоматически и прозрачно, когда это необходимо, без того, чтобы пользователь даже не знал, что в большинстве случаев происходит компиляция. Java и C# обычно принимают больше работы во время компиляции (и, следовательно, не выполняют автоматическую компиляцию), чтобы более тщательно проверять ошибки и выполнять больше оптимизации. Это континуум серого масштаба, а не черная или белая ситуация, и было бы совершенно произвольно поставить порог на некотором данном уровне и сказать, что только выше этого уровня вы называете его «компиляцией»!-)

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

Каждый Язык может быть реализован либо интерпретатором, либо компилятором. Подавляющее большинство языков имеют хотя бы одну реализацию каждого типа. (Например, есть переводчики для C и C ++, и есть компиляторы для JavaScript, PHP, Perl, Python и Ruby.) Кроме того, большинство реализаций современного языка фактически объединяют как интерпретатор, так и компилятор (или даже несколько компиляторов).

Язык - это просто набор абстрактных математических правил. Интерпретатор является одной из нескольких конкретных стратегий реализации для языка. Эти двое живут на совершенно разных уровнях абстракции. Если бы английский был напечатанным языком, термин «интерпретированный язык» был бы ошибкой типа. Заявление «Python - это интерпретированный язык» не просто ложное (потому что быть ложным означает, что утверждение даже имеет смысл, даже если оно неправильно), это просто не делает смысл, потому что язык может никогда быть определенным как «интерпретируемый».

В частности, если вы посмотрите на существующие в настоящее время реализации Python, это стратегии реализации, которые они используют:

  • Ironpython: компилируется на деревья DLR, которые затем DLR компилируется в байт -код CIL. То, что происходит с байт -кодом CIL, зависит от того, на каких клиентах вы работаете, но Microsoft .net, GNU Portable.net и Novell Mono в конечном итоге составит его с нативным машинным кодом.
  • Jython: интерпретирует Python Sourcecode, пока не идентифицирует дорожки горячего кода, которые затем компилируется в байт -код JVML. То, что происходит с байт -кодом JVML, зависит от того, на каком JVM вы работаете. Maxine будет напрямую скомпилировать его с неоптимизированным нативным кодом, пока не будет идентифицировать пути горячего кода, которые затем перекомпилируется на оптимизированный натуральный код. Hotspot сначала интерпретирует байт -код JVML, а затем в конечном итоге составит пути горячего кода с оптимизированным машинным кодом.
  • PYPY: компилируется в PYPY ByteCode, который затем интерпретируется PYPY VM, пока не идентифицирует пути горячего кода, которые затем компилируется в натуральный код, байт -код JVML или CIL BAYTECODE, в зависимости от того, на какой платформе вы используете.
  • CPYTHON: компилируется в CPYTHON BYTECODE, который затем интерпретирует.
  • Неверный Python: компилируется в CPYTHON BYTECODE, который затем интерпретирует.
  • Unleden Gowllow: компилируется в CPYTHON BYTECODE, который затем интерпретирует, пока он не идентифицирует пути горячих кодов, которые затем компилируется для LLVM IR, который затем компилятор LLVM компилируется для нативного машинного кода.
  • Cython: компилируется код Python в портативный C -код, который затем собирается со стандартным компилятором C
  • Nuitka: компилируется код Python в машинный код C ++, который затем компилируется со стандартным компилятором C

Вы можете заметить, что каждая из реализаций в этом списке (плюс некоторые другие, которые я не упомянул, например, Tinypy, Shedskin или Psyco) имеет компилятор. На самом деле, насколько я знаю, в настоящее время не существует внедрения Python, которая является чисто интерпретируемой, такая реализация не планируется, и никогда не было такой реализации.

Мало того, что термин «интерпретируемый язык» не имеет смысла, даже если вы интерпретируете его как значение «языка» с интерпретированной реализацией », это явно не так. Кто бы сказал вам это, очевидно, не знает, о чем он говорит.

В частности, .pyc Файлы, которые вы видите, - это кэшированные файлы Bytecode, созданные CPYTHON, Cackless Python или Unleden Lowlow.

Они создаются интерпретатором Python, когда .py Файл импортируется, и они содержат «скомпилированный байт -код» импортируемого модуля/программы, и идея заключается в том, что «перевод» из исходного кода в байт -код (который необходимо сделать только один раз) может быть пропущено на последующем imports Если .pyc новее соответствующий .py Файл, таким образом, немного ускоряет запуск. Но это все еще интерпретируется.

Чтобы ускорить загрузку модулей, Python кэширует скомпилированное содержание модулей в .pyc.

CPYTHON собирает свой исходный код в «байтовый код», а по причинам производительности он кэширует этот байтовый код в файловой системе, когда исходный файл имеет изменения. Это делает загрузку модулей Python намного быстрее, потому что фаза компиляции может быть обойден. Когда ваш исходный файл будет foo.py, Cpython кэширует код байта в файле foo.pyc прямо рядом с источником.

В Python3 импортный механизм Python расширяется для написания и поиска файлов кеша байтового кода в одном каталоге в каждом каталоге пакетов Python. Этот каталог будет называться __pycache__.

Вот блок -схема, описывающая, как загружаются модули:

enter image description here

Чтобы получить больше информации:

ref:PEP3147
ref:«Скомпилированные» файлы Python

Это для начинающих,

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

Запуск сценария не считается импортом, и не будет создано .pyc.

Например, если у вас есть файл скрипта abc.py который импортирует другой модуль xyz.py, когда вы бежите abc.py, xyz.pyc будет создан с тех пор, как XYZ импортируется, но файл ABC.PYC не будет созданный так как ABC.Py не импортируется.

Если вам нужно создать файл .pyc для модуля, который не импортируется, вы можете использовать py_compile а также compileall модули.

А py_compile Модуль может вручную собирать любой модуль. Один из способов - использовать py_compile.compile функция в этом модуле интерактивно:

>>> import py_compile
>>> py_compile.compile('abc.py')

Это напишет .pyc в то же место, что и Abc.py (вы можете переопределить это с помощью дополнительного параметра cfile).

Вы также можете автоматически скомпилировать все файлы в каталоге или каталогах, используя модуль Compileeall.

python -m compileall

Если имя каталога (текущий каталог в этом примере) опущено, модуль компилирует все, что найдено на sys.path

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

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

Единственное время, когда я видел проблему с этим, было, когда скомпилированный файл Bytecode каким -то образом в будущем значит, что он всегда выглядел более новее, чем исходный файл. Поскольку он выглядел новым, исходный файл никогда не был перекомпилирован, поэтому независимо от того, какие изменения вы внесли, они были проигнорированы ...

Файл Python *.py - это просто текстовый файл, в котором вы пишете несколько строк кода. Когда вы пытаетесь выполнить этот файл, используя "Python filename.py"

Эта команда вызывает виртуальную машину Python. Виртуальная машина Python имеет 2 компонента: «компилятор» и «интерпретатор». Интерпретатор не может напрямую прочитать текст в файле *.py, поэтому этот текст сначала преобразуется в байтовый код, который нацелен на PVM (не аппаратное, а PVM). Анкет PVM выполняет этот байтовый код. *.PYC также генерируется, как часть запуска его, которая выполняет вашу операцию импорта в файле в оболочке или в каком -то другом файле.

Если этот файл *.pyc уже сгенерирован, то каждый раз, когда вы запускаете/выполняете свой файл *.py, система напрямую загружает ваш файл *.pyc, который не нуждается в каком -либо компиляции (это сохранит вам несколько машинных циклов процессора).

После того, как файл *.pyc сгенерирован, нет необходимости в файле *.py, если вы не редактируете его.

Код Python проходит 2 этапа. Первый шаг собирает код в файлы .pyc, который на самом деле является байт -кодом. Затем этот файл .pyc (bytecode) интерпретируется с использованием интерпретатора cpython. Пожалуйста, обратитесь к это ссылка на сайт. Здесь процесс компиляции и выполнения кода объясняется простыми терминами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top