2010-10-07 28 views

Respuesta

29

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 que no se ejecute más rápido, pero para cargar más rápido. Por lo tanto, tiene sentido que los módulos "compilar byte" cuando los cargue.

[Editar: Para incluir notas, referencias]

de Pep 3147 en "código de bytes compilación":

CPython compila su código fuente en "código de bytes", y por motivos de rendimiento, guarda en caché este código de bytes o n 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 se puede anular. Cuando su archivo de origen es foo.py, CPython almacena en caché el código de byte en un archivo foo.pyc justo al lado de la fuente.

Cómo archivos de código compilado byte son rastreado con respecto a la versión de Python y "PY" cambios en los archivos:

Asimismo, introduce un número mágico en el código compilado ".pyc" archivos. 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 máquina virtual no causarán problemas. La marca de tiempo se utiliza para asegurarse de que el archivo pyc coincida con el archivo py que fue utilizado 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 entre 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 que recompila la fuente.

Ese es el motivo, si simplemente distribuye los archivos ".pyc" compilados para la misma plataforma, ya no funcionará, si la versión de Python cambia.

En pocas palabras

Si hay un archivo de bytes compilado".pyc "y su marca de tiempo indica que es reciente y luego 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 verá afectado, pero la carga de los archivos ".pyc" es más rápido que los archivos ".py".

conveniencia de ejecutar a.py que importa 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 usted tiene un gran archivo de script X. py, modularizarlo y mover contenidos a otros módulos da como resultado 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

+0

"los módulos tienden a ser más estables que el script o el archivo principal". ¿Cuál es la diferencia entre esos dos términos? ¿No son módulos, archivos? Además, ¿cuál es la diferencia entre la ejecución y el tiempo de carga? –

0

La compilación de la secuencia de comandos principal sería molesta para las secuencias de comandos en, por ejemplo, /usr/bin. El archivo .pyc se genera en el mismo directorio, contaminando así la ubicación pública.

+0

Si la velocidad es un factor importante, pues, había yo tengo el script principal sea lo más simple posible (de modo que la mayor parte del código sería compilado)? – George41

+0

@ George41: Según la referencia del doc. Python, la velocidad de ejecución no es un factor. Es un tiempo de carga más rápido. – pyfunc

+1

Sin embargo, como dice el documento "Por lo tanto, el tiempo de inicio de un script puede reducirse moviendo la mayor parte de su código a un módulo y tener un pequeño script de arranque que importa ese módulo", a menos que tenga un script * large * es probable overkill –

Cuestiones relacionadas