Pregunta Si se interpreta Python, ¿qué son los archivos .pyc?


Me han dado a entender que Python es un lenguaje interpretado ... Sin embargo, cuando miro mi código fuente de Python veo .pyc archivos, que Windows identifica como "Archivos compilados de Python". ¿Dónde entran estos?


796
2018-06-08 14:27


origen


Respuestas:


Ellos contienen código de bytes, que es a lo que el intérprete de Python compila la fuente. Este código luego es ejecutado por la máquina virtual de Python.

La documentación de Python explica la definición de esta manera:

Python es un lenguaje interpretado, como   opuesto a uno compilado, aunque el   distinción puede ser borrosa debido a   la presencia del compilador de códigos de bytes.   Esto significa que los archivos fuente pueden ser   ejecutar directamente sin explícitamente   creando un ejecutable que es entonces   correr.


516
2018-06-08 14:28



Me han dado a entender que   Python es un lenguaje interpretado ...

Este popular meme es incorrecto, o mejor dicho, construido sobre una comprensión errónea de los niveles del lenguaje (natural): un error similar sería decir "la Biblia es un libro de tapa dura". Déjame explicarte ese símil ...

"La Biblia" es "un libro" en el sentido de ser un clase de (libros reales, objetos físicos identificados como); se supone que los libros identificados como "copias de la Biblia" tienen algo fundamental en común (los contenidos, aunque incluso pueden ser en diferentes idiomas, con diferentes traducciones aceptables, niveles de notas a pie de página y otras anotaciones); sin embargo, esos libros son perfectamente bien permitido diferir en una miríada de aspectos que son no se considera fundamental: tipo de encuadernación, color de encuadernación, fuente (es) utilizada (s) en la impresión, ilustraciones si las hay, márgenes de escritura amplios, números y tipos de marcadores incorporados, etc., etc.

Es muy posible que típico la impresión de la Biblia sería encuadernación de tapa dura; después de todo, es un libro que normalmente debe leerse una y otra vez, marcarse en varios lugares, buscar indicios de capítulo y verso, etc., etc. una buena encuadernación de tapa dura puede hacer que una copia dada dure más tiempo bajo dicho uso. Sin embargo, estos son asuntos mundanos (prácticos) que no se pueden utilizar para determinar si un objeto de libro real dado es una copia de la Biblia o no: ¡las impresiones en rústica son perfectamente posibles!

Del mismo modo, Python es "un lenguaje" en el sentido de definir una clase de idioma implementaciones que deben ser todos similares en algunos aspectos fundamentales (sintaxis, la mayoría de la semántica, excepto aquellas partes en las que se les permite diferir explícitamente), pero se les permite diferir en casi todos los detalles de "implementación", incluida la forma en que tratan el los archivos de origen que se les proporcionan, si compilan las fuentes en algunos formularios de nivel inferior (y, en caso afirmativo, qué formulario, y si guardan dichos formularios compilados, en el disco o en otro lugar), cómo ejecutan dichos formularios, etc. .

La implementación clásica, CPython, a menudo se llama simplemente "Python", pero es solo una de varias implementaciones de calidad de producción, junto con IronPython de Microsoft (que compila códigos CLR, es decir, ".NET"), Jython (que compila los códigos JVM), PyPy (que está escrito en Python y puede compilar a una gran variedad de formularios "back-end", incluido el lenguaje de máquina generado "justo a tiempo"). Son todas Python (== "implementaciones del lenguaje Python") al igual que muchos objetos de libro superficialmente diferentes pueden ser Biblias (== "copias de La Biblia").

Si está interesado específicamente en CPython: compila los archivos fuente en un formulario de nivel inferior específico de Python (conocido como "bytecode"), lo hace automáticamente cuando es necesario (cuando no hay un archivo de código de bytes correspondiente a un archivo fuente, o el archivo de bytecode es anterior a la fuente o compilado por una versión de Python diferente), generalmente guarda los archivos de código de bytes en el disco (para evitar recompilarlos en el futuro). OTOH IronPython generalmente compilará códigos CLR (guardándolos en disco o no, dependiendo de ellos) y Jython en códigos JVM (guardándolos en el disco o no; usará el .class extensión si las guarda).

Estos formularios de nivel inferior se ejecutan luego mediante "máquinas virtuales" apropiadas, también conocidas como "intérpretes": CPython VM, .Net runtime, Java VM (también conocido como JVM), según corresponda.

Entonces, en este sentido (qué hacen las implementaciones típicas), Python es un "lenguaje interpretado" si y solo si C # y Java son: todos tienen una estrategia de implementación típica de producir bytecode primero, y luego ejecutarlo a través de una VM / intérprete .

Lo más probable es que la atención se centre en qué tan "pesado", lento y alto es el proceso de compilación. CPython está diseñado para compilar lo más rápido posible, lo más liviano posible, con la menor ceremonia posible: el compilador realiza muy pocas comprobaciones y optimizaciones de errores, por lo que puede ejecutarse rápidamente y en pequeñas cantidades de memoria, lo que a su vez lo permite se ejecute de forma automática y transparente siempre que sea necesario, sin que el usuario tenga que estar consciente de que hay una compilación en curso, la mayoría de las veces. Java y C # normalmente aceptan más trabajo durante la compilación (y, por lo tanto, no realizan una compilación automática) para revisar los errores más a fondo y realizar más optimizaciones. Es un continuo de escalas de grises, no una situación en blanco y negro, y sería absolutamente arbitrario poner un umbral en un nivel dado y decir que solo por encima de ese nivel lo llamas "compilación"!


779
2018-06-08 15:00



No existe el lenguaje interpretado. Que se use un intérprete o un compilador es simplemente un rasgo del implementación y no tiene absolutamente nada que ver con el idioma.

Cada el lenguaje puede ser implementado por un intérprete o un compilador. La gran mayoría de los idiomas tienen al menos una implementación de cada tipo. (Por ejemplo, hay intérpretes para C y C ++ y hay compiladores para JavaScript, PHP, Perl, Python y Ruby.) Además, la mayoría de las implementaciones de idiomas modernos en realidad combinan un intérprete y un compilador (o incluso múltiples compiladores).

Un lenguaje es solo un conjunto de reglas matemáticas abstractas. Un intérprete es una de varias estrategias de implementación concretas para un idioma. Esos dos viven en niveles de abstracción completamente diferentes. Si el inglés fuera un lenguaje tipeado, el término "lenguaje interpretado" sería un error de tipo. La afirmación "Python es un lenguaje interpretado" no es solo falso (porque ser falso implicaría que la afirmación incluso tiene sentido, incluso si es incorrecta), simplemente no hace sentidoporque un idioma puede Nunca ser definido como "interpretado".

En particular, si nos fijamos en las implementaciones de Python actualmente existentes, estas son las estrategias de implementación que están utilizando:

  • IronPython: se compila en árboles DLR que luego el DLR compila a bytecode CIL. Lo que sucede con el bytecode de CIL depende del CLI VES en el que se esté ejecutando, pero Microsoft .NET, GNU Portable.NET y Novell Mono compilarán eventualmente el código de máquina nativo.
  • Jython: interpreta el código fuente de Python hasta que identifica las rutas de los códigos de acceso rápido, que luego compila en bytecode JVML. Lo que sucede con el bytecode JVML depende de la JVM en la que se esté ejecutando. Maxine compilará directamente el código nativo no optimizado hasta que identifique las rutas del código activo, que luego recompila para optimizar el código nativo. HotSpot primero interpretará el código de byte JVML y luego compilará las rutas del código caliente para optimizar el código de la máquina.
  • PyPy: se compila en PyPy bytecode, que luego es interpretado por PyPy VM hasta que identifica las rutas de los códigos calientes que luego compila en código nativo, bytecode JVML o bytecode según la plataforma en la que se está ejecutando.
  • CPython: compila a CPython bytecode que luego interpreta.
  • Stackless Python: se compila en CPython bytecode que luego interpreta.
  • Unladen Swallow: se compila en CPython bytecode que luego interpreta hasta que identifica las rutas de los códigos de acceso rápido que luego compila a LLVM IR que el compilador de LLVM luego compila para el código de máquina nativo.

Puede notar que cada una de las implementaciones en esa lista (más algunas otras que no mencioné, como tinypy, Shedskin o Psyco) tiene un compilador. De hecho, hasta donde yo sé, actualmente no hay una implementación de Python que sea puramente interpretada, no hay tal implementación planeada y nunca ha existido tal implementación.

El término "lenguaje interpretado" no solo no tiene sentido, incluso si lo interpreta como "lenguaje con implementación interpretada", claramente no es cierto. Quien sea que te haya dicho eso, obviamente no sabe de lo que está hablando.

En particular, el .pyc los archivos que está viendo se almacenan en caché mediante los archivos de código producidos por CPython, Stackless Python o Unladen Swallow.


126
2018-06-08 15:25



Estos son creados por el intérprete de Python cuando .py se importa, y contienen el "bytecode compilado" del módulo / programa importado, con la idea de que la "traducción" del código fuente al bytecode (que solo debe hacerse una vez) se puede omitir en posteriores imports si el .pyc es más nuevo que el correspondiente .py archivo, lo que acelera el inicio un poco. Pero aún se interpreta.


55
2018-06-08 14:30



Python (al menos la implementación más común) sigue un patrón de compilación de la fuente original a códigos de bytes, y luego interpreta los códigos de bytes en una máquina virtual. Esto significa (una vez más, la implementación más común) no es un intérprete puro ni un compilador puro.

El otro lado de esto es, sin embargo, que el proceso de compilación está casi oculto: los archivos .pyc básicamente se tratan como un caché; aceleran las cosas, pero normalmente no tienes que ser consciente de ellos en absoluto. Los invalida y vuelve a cargar automáticamente (vuelve a compilar el código fuente) cuando es necesario en función de las marcas de fecha / hora del archivo.

La única vez que vi un problema con esto fue cuando un archivo de código de bytes compilado de alguna manera obtuvo una marca de tiempo en el futuro, lo que significaba que siempre parecía más nuevo que el archivo de origen. Dado que parecía más nuevo, el archivo fuente nunca se volvió a compilar, por lo que independientemente de los cambios que haya realizado, se ignoraron ...


20
2018-06-08 15:01



ESTO ES PARA PRINCIPIANTES,

Python compila automáticamente su script para compilar el código, llamado código byte, antes de ejecutarlo.

Ejecutar un script no se considera una importación y no se creará .pyc.

Por ejemplo, si tiene un archivo de script abc.py que importa otro módulo xyz.pycuando corres abc.py, xyz.pyc se creará desde que se importa xyz, pero no se mostrará ningún archivo abc.pyc creado ya que abc.py no se está importando.

Si necesita crear un archivo .pyc para un módulo que no se importa, puede usar py_compile y compileall módulos.

los py_compile el módulo puede compilar manualmente cualquier módulo. Una forma es usar el py_compile.compile función en ese módulo de forma interactiva:

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

Esto escribirá el .pyc en la misma ubicación que abc.py (puede anular eso con el parámetro opcional cfile)

También puede compilar automáticamente todos los archivos en un directorio o directorios usando el módulo compileall.

python -m compileall

Si se omite el nombre del directorio (el directorio actual en este ejemplo), el módulo compila todo lo que se encuentra en sys.path


18
2017-11-03 06:47



Para acelerar los módulos de carga, Python guarda en caché el contenido compilado de los módulos en .pyc.

CPython compila su código fuente en "código de bytes" y, por motivos de rendimiento, almacena en caché este código de bytes en el sistema de archivos siempre que el archivo de origen tenga cambios. Esto hace que la carga de los módulos de Python sea mucho más rápida porque la fase de compilación puede pasarse por alto. Cuando su archivo de origen es foo.py, CPython guarda en caché el código de bytes en un archivo foo.pyc justo al lado de la fuente.

En python3, el mecanismo de importación de Python se amplía para escribir y buscar archivos de caché de códigos de bytes en un solo directorio dentro de cada directorio de paquetes de Python. Este directorio se llamará __pycache__.

Aquí hay un diagrama de flujo que describe cómo se cargan los módulos:

enter image description here

Para más información:

árbitro:PEP3147
árbitro:Archivos "compilados" de Python


16
2017-07-11 17:04



El archivo * .py de Python es solo un archivo de texto en el que se escriben algunas líneas de código. Cuando intenta ejecutar este archivo usando diga "python filename.py"

Este comando invoca la máquina virtual de Python. Python Virtual Machine tiene 2 componentes: "compilador" e "intérprete". El intérprete no puede leer directamente el texto en el archivo * .py, por lo que este texto se convierte primero en un código de bytes que está dirigido al PVM. (no hardware pero PVM). PVM ejecuta este código de bytes. * El archivo .pyc también se genera, como parte de su ejecución, que realiza su operación de importación en un archivo en shell o en algún otro archivo.

Si este archivo * .pyc ya está generado, cada vez que ejecute / ejecute su archivo * .py, el sistema cargará directamente su archivo * .pyc, que no necesitará ninguna compilación (Esto le ahorrará algunos ciclos de procesador de la máquina).

Una vez que se genera el archivo * .pyc, no hay necesidad de un archivo * .py, a menos que lo edite.


9
2017-12-15 06:03



El código Python pasa por 2 etapas. El primer paso compila el código en archivos .pyc que en realidad es un bytecode. Entonces este archivo .pyc (bytecode) se interpreta usando el intérprete CPython. Por favor refiérase a esta enlazar. Aquí el proceso de compilación y ejecución del código se explica en términos sencillos.


7
2018-03-26 06:41