【Python学习笔记】 第2章 Python如何运行程序

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倍。