tasks as a programmer, or as a Python interpreter.
程序员角度:
In its simplest form, a Python program is just a text file containing Python statements.
解释器视角:
1.将源代码编译成字节码(byte code)的形式。
字节码是源代码底层的、与平台无关的表现形式。byte code 比源代码速度快。
如果python进程在机器上有写的权限,则字节码会保存为一个以pyc为扩展名的文件
在python3.2之前,在程序运行后,你会在源代码同目录下看到对应的pyc文件。在python3.2之后,会存在与源代码同目录的__pycache__文件夹中,后缀名会显示出python的版本,例如 script.cpython-33.pyc。
python通过这种方式完成对启动速度的优化。只要你没更改过源文件且用与pyc同一版本的python运行,那么python将会导入pyc文件,跳过编译步骤。
- 源文件:python会对比源文件和byte code的时间戳,不同则重新编译
- 版本:版本不同也会重新编译
如果无法在机器中保存字节码,那么它会生成在内存中,并且当退出程序时字节码会被舍弃。字节码也可以分发python程序,因为即使没有源代码,在只有字节码的情况下依然可以运行。
但需要注意,只有文件导入的情况,字节码才保存。顶层文件只能用脚本运行。另外,交互提示模式下也不会保存字节码。
2.The Python Virtual Machine (PVM)
一旦程序被编译成字节码(或导入已有的pyc文件),字节码就会被输送到PVM去执行。
PVM不是一个单独的程序,不需要被单独安装。实际上,PVM是一个大的代码循环,它逐一执行字节码指令去实现它们的操作。PVM是python的运行引擎,它总是作为python系统的一部分出现,并且他是实际运行脚本的组件。技术上讲,它是Python解释器的最后一步。
这就造成python仍然需要PVM(不是CPU芯片)去解释字节码,字节码的指令集较CPU指令集需要更多的工作,从而导致比C等编译型语言慢,但python又不需要每次都重新分析每一条源代码,这导致其比纯解释型语言要快一点。