Python运行脚本时,在代码开始处理之前,Python会执行一些步骤,确切的说,第一步时编译成所谓的字节码,之后将其转发到所谓的虚拟机中。

一、字节码编译

当程序执行时,Python内部会先将源代码编译成字节码的形式。这些字节码可以提高执行速度。如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保持为一个以.pyc为扩展名的文件(.pyc就是编译过的.py源代码)。当程序运行之后,你会在那些源代码的附近(也就是说同一个目录下)看到这些文件。

Python这样保持字节码时作为一种启动速度的优化,下一次运行程序时,如果你在上次保存字节码后没有修改过源代码的话,Python将加载.pyc文件并跳过编译这个步骤。如果有修改,下次运行时字节码将自动重新创建。

如果进程没有写入权限,则字节码将会在内存中生成,在程序结束时被丢弃。

 

二、Python虚拟机(PVM)

一旦程序编译成字节码(或字节码已从存在的.pyc文件中载入),之后的字节码会发送到Python虚拟机上来执行。PVM是Python的运行引擎,它是实际运行脚本的组件,从技术上讲,它是Python解释器的最后一步。

三、关于性能

Python没有build或make的步骤,代码写好后可立即运行。此外,Python字节码不是机器的二进制代码,字节码是特定于python的一种表现形式。这就是Python无法运行的像C代码一样快的原因,PVM仍然需要解释字节码,而且字节码指令与CPU指令相比需要更多的工作。另一方面,和其他传统解释器不同,Python仍有内部的编译步骤:它并不需要反复的重分析和重分解每一行语句。因此Python代码的运行速度介于传统的编译语言和解释语言之间。

Python所有的事情都是在程序运行时发生的,包括建立函数和类的操作以及连接的模块,这些事情对于静态语言往往是发生在执行之前的。