Es una gran confusión para las personas que comenzaron a trabajar en Python y las respuestas aquí son un poco difíciles de comprender, así que lo haré más fácil.
Cuando le indicamos a Python que ejecute nuestro script, hay algunos pasos que Python lleva a cabo antes de que nuestro código comience a funcionar:
- Se compila en bytecode.
- Luego se enruta a la máquina virtual.
Cuando ejecutamos un código fuente, Python lo compila en un código de bytes. La compilación es un paso de traducción, y el código de bytes es una representación de código fuente independiente de la plataforma de bajo nivel. Tenga en cuenta que el código de bytes de Python no es un código de máquina binario (por ejemplo, instrucciones para un chip Intel).
En realidad, Python traduce cada declaración del código fuente en instrucciones de código de bytes descomponiéndolas en pasos individuales. La traducción del código de bytes se realiza para acelerar la ejecución. El código de bytes se puede ejecutar mucho más rápido que las declaraciones del código fuente original. Tiene la extensión.pyc y se escribirá si puede escribir en nuestra máquina.
Entonces, la próxima vez que ejecutemos el mismo programa, Python cargará el archivo .pyc y omitirá el paso de compilación a menos que se haya cambiado. Python comprueba automáticamente las marcas de tiempo de los archivos de código fuente y de bytes para saber cuándo debe volver a compilarse. Si volvemos a guardar el código fuente, el código de bytes se volverá a crear automáticamente la próxima vez que se ejecute el programa.
Si Python no puede escribir los archivos de código de bytes en nuestra máquina, nuestro programa aún funciona. El código de bytes se genera en la memoria y simplemente se descarta al salir del programa. Pero debido a que los archivos .pyc aceleran el tiempo de inicio, es posible que deseemos asegurarnos de que se haya escrito para programas más grandes.
Resumamos lo que sucede detrás de escena. Cuando un Python ejecuta un programa, Python lee el .py en la memoria, lo analiza para obtener un código de bytes y luego se ejecuta. Para cada módulo importado por el programa, Python primero verifica si hay una versión de código de bytes precompilada, en un .pyo o .pyc, que tiene una marca de tiempo que corresponde a su archivo .py. Python usa la versión de bytecode si la hay. De lo contrario, analiza el archivo .py del módulo, lo guarda en un archivo .pyc y utiliza el código de bytes que acaba de crear.
Los archivos de código de bytes también son una forma de enviar códigos Python. Python seguirá ejecutando un programa si todo lo que puede encontrar son archivos .pyc, incluso si los archivos fuente .py originales no están allí.
Máquina virtual Python (PVM)
Una vez que nuestro programa ha sido compilado en código de bytes, se envía para su ejecución a Python Virtual Machine (PVM). El PVM no es un programa separado. No es necesario que se instale solo. En realidad, el PVM es solo un gran bucle que itera a través de nuestra instrucción de código de bytes, uno por uno, para llevar a cabo sus operaciones. El PVM es el motor de tiempo de ejecución de Python. Siempre está presente como parte del sistema Python. Es el componente que realmente ejecuta nuestros scripts. Técnicamente es solo el último paso de lo que se llama el intérprete de Python.