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 un .pyc
? ¿Esto desacelera las cosas? ¿Sería mejor mantener el archivo principal lo más pequeño posible entonces, o no importa?¿Por qué los scripts principales de Python ejecutables no se compilan en archivos pyc como módulos?
¿Por qué los scripts principales de Python ejecutables no se compilan en archivos pyc como módulos?
Respuesta
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
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.
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
@ 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
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 –
- 1. Hacer que Python ignore los archivos .pyc
- 2. ¿Los archivos Python 2.5 .pyc son compatibles con los archivos .pyc de Python 2.6?
- 3. módulos Ejecutora como scripts
- 4. ¿Por qué Perl no compila en archivos binarios como python?
- 5. ¿Cómo importa Python los módulos de los archivos .egg?
- 6. ¿Cómo evitar los archivos .pyc?
- 7. ¿Por qué Virtualenv en Windows no asocia archivos .py/.pyw/.pyo/.pyc con la versión de virtualenv de los ejecutables de Python?
- 8. python: ¿pueden los archivos zip ejecutables incluir archivos de datos?
- 9. ¿Por qué los archivos .pyc de python contienen la ruta absoluta de su código fuente?
- 10. ¿Qué usuario ejecutan los scripts Python como en Windows?
- 11. Cambiar el directorio donde se crean los archivos .pyc
- 12. ¿Qué hacer con los archivos pyc cuando se usa Django o python con Mercurial?
- 13. ¿Por qué los módulos Python cv2 dependen de (antiguo) cv
- 14. ¿Dónde se compilan los archivos JSP Java (* __ jsp.java)?
- 15. ¿Distribuir mis scripts de Python como archivos JAR con Jython?
- 16. Hacer ejecutables todos los archivos PHP (recursivamente)
- 17. ¿Cómo se organizan los módulos de Python?
- 18. Creando archivos ejecutables en Linux
- 19. enormes ejecutables debido a los símbolos de depuración, ¿por qué?
- 20. ¿Por qué los archivos ejecutables de Haskell/GHC son tan grandes en tamaño de archivo?
- 21. Perl CGI Scripts no puede encontrar módulos en la biblioteca
- 22. múltiples "líneas principales" en módulos OCaml vinculados
- 23. ¿Por qué un antiguo archivo .pyc rompía Django?
- 24. ¿Dónde se almacenan los módulos de python?
- 25. ¿Cómo se cruzan los archivos ejecutables ELF para Android?
- 26. ¡Juego! marco: las vistas no se compilan?
- 27. ¿Cuáles son las limitaciones de distribuir archivos .pyc?
- 28. ¿Por qué no se unifican los dictados de Python?
- 29. Python - 'importar' o pasar los módulos como parámetros?
- 30. ¿Tus javadocs se compilan en tus archivos de clase?
"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? –