《Learning Python》 笔记 第 2 章 Python 如何运行程序
Notes Learning Python
Lastmod: 2024-08-03 周六 19:17:24

《Learning Python》 笔记 第 2 章 Python 如何运行程序

Python 解释器简介

Python 是一门编程语言,同时是一个名为解释器的软件包。

解释器是让其他程序运行起来的程序,是代码与机器的计算机硬件之间的软件逻辑层。

Python 包安装后会得到至少一个解释器和一套支持库。

程序执行

程序员的视角

一般 Python 文件以 .py 结尾。

可以通过如下方式运行一段 Python 脚本

> python script.py

Python 的视角

字节码编译

执行程序时,Python 内部会先将源代码编译成所谓的字节码形式。字节码是一种低级的与平台无关的表现形式。

Python 进程在机器上拥有写入权限时,他将会把字节码保存在一个 .pyc 后缀的文件里。(Python 3.2 以前的版本会保存在同名 .py 文件的目录下,Python 3.2 及之后的版本会保存到 __pycache__ 的子目录中,同时在扩展名中会带有编译它们的 Python 的版本信息)。

保存字节码是对启动速度的一种优化,如果保存字节码后没有修改代码,并且运行的是同一个 Python 版本,则会跳过编译步骤直接加载对应的 .pyc 文件。

如果 Python 不具有写入权限,则字节码只会在内存中生成,并在运行结束时被丢弃。

可以通过发布字节码,实现发布 Python 程序。 Python 如果找到 .pyc 文件而没有找到 .py 文件,一样可以运行程序。

字节码只会针对被导入的文件生成而不是顶层的执行脚本。

Python 虚拟机(PVM)

字节码会发送到 Python 虚拟机 Python Virtual Machine 上执行。它不是一个独立程序,不需要安装。本质上它是一个迭代运行字节码指令的一个大循环。PVM 是 Python 的运行时引擎,时常表现为 Python 系统的一部分,技术上它只是,Python 解释器的最后一步。

性能的含义

没有类似于 C++ make 的过程。字节码不是二进制代码,因此在 PVM 还需要进一步解释字节码,因此它无法像 C++ 一样快。但因为其内部有编译过程,不需要反复的重新分析重新分解,因此会比其他的经典解释语言快。

开发的含义

开发与执行环境相同。Python 代码可以动态的被修改。Python 中只有运行时。

执行模型的变体

上面的内部执行模型是 Python 的标准实现形式,但并不是语言必须的。

Python 的各种实现

CPython 标准的 Python 实现。因为它由 ANSI C 编写而成。通常都会得到和使用这个版本。

Jython 基于 Java 的 Python。目的是与 Java 集成。字节码运行在 Java 虚拟机。

IronPython 基于 .NET 的 Python。

Stackless 注重并发的 Python。

PyPy 注重速度的 Python。提供了带有即时编译器(just-in-time, JIT)的 Python 快速实现。能够运行绝代多大多数的 CPython 代码。

执行优化工具

其他系统则尝试优化执行模块

Cython 是 Python 与 C 的混合体。

Shed Skin 是 Python 到 C++ 的转换器

Psyco 是一个可以让 Python 运行更快的执行组件,往往被视为 JIT。

冻结二进制文件

有时需要 Python 能够生成二进制可执行文件。

py2exe Windows

PyInstaller Linux 和 Mac OS

py2app Mac OS

未来的可能性

Parrot 提供一种包括 Python 在内的多语言通用字节码格式、虚拟机及优化技术。

Unladen Swallow 添加 JIT 来提升兼容性和速度。

Prev: [Vim] usr_09
Next: 《Learning Python》 笔记 第 3 章 你应如何运行程序