¿Cómo lee e interpreta Python los archivos de origen?

Digamos que ejecuto un script de Python (2.7, aunque no estoy seguro de que haga una diferencia aquí). En lugar de terminar el script, me salgo, o de alguna manera vuelvo a mi entorno de edición. Luego puedo modificar el script y guardarlo, pero esto no cambia nada en el script que aún se está ejecutando.

¿Python carga todos los archivos de origen en la memoria completamente en el inicio? Tengo la impresión de que así es como funciona el intérprete de Python, pero esto contradice mis otras vistas del intérprete de Python: he oído que los archivos .pyc sirven como código de bytes para la máquina virtual de Python, como los archivos .class en Java. Al mismo tiempo, sin embargo, algunas implementaciones de Python (muy pocas a mi entender) también utilizan técnicas de comstackción justo a tiempo.

Entonces, estoy en lo cierto al pensar que si realizo un cambio en un archivo .py mientras se ejecuta mi script, no veo ese cambio hasta que vuelvo a ejecutar el script, porque en el inicio se comstackn todos los archivos .py necesarios .pyc , y simplemente modificar los archivos .py no .pyc archivos .pyc ?

Si eso es correcto, entonces ¿por qué no los grandes progtwigs, como el que estoy trabajando con ~ 6,550 kilobytes de código fuente distribuidos en más de 20 archivos .py , tardan una eternidad en comstackrse al inicio? ¿Cómo es el progtwig en sí tan rápido ?


Información adicional:

  • No estoy usando módulos de terceros. Todos los archivos han sido escritos localmente. El archivo fuente principal es relativamente pequeño (10 kB), pero el archivo fuente en el que trabajo principalmente es de 65 kB. También se escribió localmente y cambia cada vez antes del lanzamiento.

Python carga el script principal en la memoria, lo comstack en el bytecode y lo ejecuta. Si modifica el archivo fuente mientras tanto, no está afectando el código de bytes.

Si está ejecutando la secuencia de comandos como la secuencia de comandos principal (es decir, llamándola como python myfile.py , el python myfile.py se descartará cuando python myfile.py la secuencia de comandos.

Sin embargo, si está importando la secuencia de comandos, el código de bytes se escribirá en el disco como un archivo .pyc que no se volverá a comstackr cuando se vuelva a importar, a menos que modifique el archivo .py correspondiente.

Su gran progtwig de 6.5 MB consta de muchos módulos que son importados por la secuencia de comandos principal (probablemente pequeña), por lo que solo se tendrá que comstackr en cada ejecución. Todos los demás archivos tendrán su archivo .pyc listo para ejecutarse.

En primer lugar, tiene razón al entender que el intérprete no ve los cambios en un archivo fuente de Python hasta la próxima ejecución. Existen algunos sistemas de depuración, generalmente construidos para fines de propiedad, que le permiten recargar módulos, pero esto trae complejidades asociadas como, por ejemplo, objetos existentes que conservan referencias al código del módulo anterior. Aunque puede ser realmente feo.

La razón por la que los grandes progtwigs se inician tan rápidamente es que el intérprete intenta crear un archivo .pyc para cada archivo .py que importa si no existe el archivo .pyc correspondiente o si el .py es más nuevo. El .pyc es de hecho el progtwig comstackdo en el código de bytes, por lo que es relativamente rápido de cargar.

En cuanto a la comstackción de JIT, puede estar pensando en la implementación de PyPy, que está escrita en Python y tiene backends en varios idiomas diferentes. Se está utilizando cada vez más en las tiendas Python 2 donde la velocidad de ejecución es importante, pero está muy lejos del CPython que todos conocemos y amamos.