Python是一种动态的脚本语言,在程序编写完成,运行过程中不需要程序员去特意的进行编译程序,就可以运行,是不是感觉到很神奇,你可能会产生疑惑?计算机是如何识别运行Python程序呢?
1. Python实际上是需要“编译”过程的
当Python运行脚本时, Python还会执行一些步骤。 第一步是编译成所谓的“字节码”, 之后将其转发到所谓的“虚拟机”中运行。在运行程序时,解释器首先会将代码编译成字节码,然后将字节码交给虚拟机解释运行,而我们安装的Python解释器就是包括了虚拟机的Python运行引擎,也就是说Python程序的“编译”过程实际上是由解释器自动完成的,只不过这一过程对用户是透明的。Python传统的运行模式如图所示。

Python的运行模式:源程序(.py)编译成字节码(以.pyc文件存在),这里需要注意的是字节码文件并不是二进制文件,还需要将其传送到虚拟机(PVM)中进行解释运行。这就是Python代码无法运行得像C或C++代码一样快的原因。值得庆幸的是这一过程对于我们来说是隐藏的,不需要我们手动操作,解释器会自动的完成这一系列的操作,如果这些过程需要我们手动完成的话,是不是感觉Python瞬间不香了。
2. 字节码的前世今生
Python的编译过程概括地说, 就是把每一条源语句分解为单一步骤来将这些源语句翻译成一组字节码指令。 这些字节码可以提高执行速度: 比起文本文件中原始的源代码语句, 字节码的运行速度要快得多。
字节码为一个以.pyc为扩展名的文件(".pyc"就是编译过的".py"源代码)通常是在当前目录下__pycache__文件夹下命名为:源程序名.解释器版本.pyc的文件。
Python学习手册:Python保存字节码是作为一种启动速度的优化。 下一次运行程序时, 如果你在上次保存字节码之后没有修改过源代码的话, Python将会加载.pyc文件并跳过编译这个步骤。 当Python必须重编译时, 它会自动检查源文件和字节码文件的时间戳: 如果你又保存了源代码, 下次程序运行时, 字节码将自动重新创建。
也就是说,如果你在运行源程序后没有修改过源代码,Python下次运行时就会跳过编译这个阶段,直接解释运行字节码文件,否者就会重新编译源代码,而这一过程是根据源代码和字节码的时间戳进行判别比较的。
对于大型程序,也可以直接分发字节码文件进行运行,而不需要源程序文件。
Python作为脚本语言,其运行过程包括编译成字节码和在虚拟机上解释执行。Python解释器自动完成编译,将源代码转换为.pyc文件,第二次运行时,若未修改源代码,Python会直接加载字节码,提高启动速度。字节码文件存储在__pycache__文件夹,根据源代码和字节码的时间戳判断是否需要重新编译。

被折叠的 条评论
为什么被折叠?



