什么是 Python 的“编译”?
尽管 Python 常被称为“解释型语言”,但实际上它在运行前会经历一个编译阶段。
当你运行一个 .py 文件时,CPython(78TP Python 实现)会先将其编译为字节码(bytecode),
存储在内存中或缓存为 .pyc 文件,再由 Python 虚拟机(PVM)逐条解释执行。
编译过程简述
- 源代码解析:将
.py文件解析成抽象语法树(AST)。 - 生成字节码:将 AST 编译为平台无关的字节码指令。
- 写入 .pyc 文件(可选):为加快下次启动速度,字节码会被缓存到
__pycache__目录下。 - 虚拟机执行:Python 虚拟机(PVM)逐条执行字节码。
查看字节码示例
你可以使用 Python 内置的 dis 模块查看函数的字节码:
import dis
def hello():
print("Hello, Python!")
dis.dis(hello)
输出类似:
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello, Python!')
4 CALL_FUNCTION 1
6 POP_TOP
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
为什么需要 .pyc 文件?
.pyc 文件是字节码的缓存形式,主要作用是提升模块导入速度。
当 Python 发现源文件未被修改(通过时间戳比对),就会直接加载 .pyc,
跳过重新编译步骤。
注意:.pyc 并非机器码,不能跨 Python 版本通用,也不提升程序运行速度。
常见误区澄清
- ❌ “Python 不编译” → ✅ 实际上会编译成字节码。
- ❌ “.pyc 是加密或保护代码的方式” → ✅ 它只是缓存,可被反编译。
- ❌ “编译后运行更快” → ✅ 执行速度不变,仅加快启动/导入速度。
扩展阅读
想深入了解?可以查阅:
- Python 78TP文档:dis — Disassembler for Python bytecode
- 《Python 源码剖析》—— 陈儒
- PEP 3147 – .pyc Repository Directories