Python解释器简介
我们在Python的官网下载并安装Python后,它会生成一些组件,包括解释器和一套支持库。Python的代码必须在解释器中运行。
程序运行
程序员的视角
一个Python程序仅是一个包含Python语句的文本文件。例:创建script0.py文件,并写上:
print("Hello, world!")
print(2 ** 100)
然后,我们在命令行窗口,调用Python执行文件:
Python的视角
在解释器解释文件的内容时,还会做一些别的事情。
字节码编译
如果Python在机器上拥有写入权限,那么它把程序的字节码保存为一个以.pyc
为扩展名的文件,这个就是字节码文件。在版本3.2之前,文件与源文件同目录;在版本3.2之后,文件在__pycache__
目录中。在这个目录中还保存了编译它们的Python版本信息。
Python这么做的目的是对启动速度优化。下次运行程序时,Python先检查:
-
源文件是否改变:检查源文件和字节码文件最后一次修改的时间戳。
-
Python的版本:是否版本不同。
然后确定是否要重新编译并生成字节码文件。大型程序中,字节码文件有助于加速启动。
Python虚拟机
Python将程序编译成字节码后,就可以发送到Python虚拟机上执行。Python虚拟机是解释器的一部分,也是解释器的最后一环。
性能的含义
Python的源代码在写好后可以立刻运行。字节码只是特定于Python的一种表现形式。Python仍然需要解释字节码,这使得Python的运行速度不如C/C++。
开发的含义
Python的编译后立刻执行的特性使得开发周期大大缩短。
执行模型的变体
Python的各种实现
CPython:标准Python
最初的、标准的Python
Jython:基于Java的Python
设计目的是与Java编程语言集成。作用是将Python源代码编译成Java字节码,使其可以运行在Java虚拟机上。
IronPython:基于.NET的Python
可以与Windows平台上的.NET框架以及与之对应的Linux开源的Mono编写成的应用相集成。
Stackless:注重并发的Python
它不会在栈上保存状态,使得Python更容易移植到较小的栈架构中。
PyPy:注重速度的Python
执行优化工具
Cython:Python和C的混合
Shed Skin:Python到C++的转换器
Psyco:原先的即时编译器
冻结二进制文件
有时候我们希望能够拥有一个把Python程序编译成二进制文件的简单方法。
实现上述想法的工具有:py2exe(Windows)、PyInstaller(Linux、Mac OS X)等等。
未来的可能性
未来也许有新的字节码格式和实现方式的变体将被采用。比如:
-
Parrot:提供多种语言通用的字节码格式、虚拟机以及优化技术。
-
Unladen Swallow:将Python提速至少5倍。