ejecutar - ¿Por qué los scripts principales de Python ejecutables no se compilan en archivos pyc como módulos?
ejecutar python desde cmd (2)
Entiendo que cuando importa un módulo, ese archivo se compila en un archivo .pyc
para hacerlo más rápido. ¿Por qué el archivo principal tampoco está compilado en .pyc
? ¿Esto desacelera las cosas? ¿Sería mejor mantener el archivo principal lo más pequeño posible entonces, o no importa?
Compilar el script principal sería molesto para los scripts en, por ejemplo, /usr/bin
. El archivo .pyc se genera en el mismo directorio, contaminando así la ubicación pública.
Cuando se carga un módulo, el archivo py se "compila en bytes" a archivos pyc. La marca de tiempo se registra en archivos pyc. Esto se hace para no hacer que funcione más rápido, sino para cargar más rápido. Por lo tanto, tiene sentido para los módulos de "byte compilar" cuando los carga.
[Editar: para incluir notas, referencias]
De PEP 3147 en "compilación de código de bytes":
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.
Cómo se rastrean los archivos compilados de código de bytes con respecto a la versión de Python y los cambios de archivo "py":
También inserta un número mágico en los archivos del código de bytes compilados ".py". Esto cambia cada vez que Python cambia el formato del código de bytes, generalmente en versiones principales.
Esto garantiza que los archivos pyc creados para versiones anteriores de la VM no causen problemas. La marca de tiempo se utiliza para asegurarse de que el archivo pyc coincida con el archivo py que se utilizó para crearlo. Cuando el número mágico o la marca de tiempo no coinciden, el archivo py se vuelve a compilar y se escribe un nuevo archivo pyc.
Los archivos "pyc" no son compatibles en las principales versiones de Python. Cuando Python encuentra un archivo pyc con un número mágico que no coincide, vuelve al proceso más lento de recompilación de la fuente.
Esa es la razón, si simplemente distribuyes los archivos ".pyc" compilados para la misma plataforma, no funcionarán más, si la versión de Python cambia.
En pocas palabras
Si hay un archivo compilado en bytes ".pyc" y su marca de tiempo indica que es reciente, entonces se cargará. De lo contrario, python se retractará con el método más lento de cargar los archivos ".py". El rendimiento de ejecución del archivo ".py" no se ve afectado, pero la carga de los archivos ".pyc" es más rápida que los archivos ".py".
Considere ejecutar a.py que importe b.py
Typical total performance = loading time (A.py) + execution time (A.py) +
loading time (B.py) + execution time (B.py)
Since loading time (B.pyc) < loading time (B.py)
You should see a better performance by using the byte compiled "pyc" files.
Dicho esto, si tiene un archivo de secuencia de comandos grande X.py, modularizarlo y mover contenidos a otros módulos resulta en aprovechar el menor tiempo de carga para el archivo compilado de código de bytes.
Otra inferencia es que los módulos tienden a ser más estables que el script o el archivo principal. Por lo tanto, no se compila en bytes en absoluto.
Referencias