🐍 Python 底层执行机制

从源代码到虚拟机执行,完整拆解每一步

1
源代码 Source Code
开发者编写的 .py 文件,纯文本格式。这是整个流程的起点。
x = 1 + 2
python xxx.py
2
词法分析 Lexer / Tokenizer
将源码字符串拆解为一系列 Token(词法单元)。每个 Token 是一个有意义的语法片段。
# x = 1 + 2 的 token 流: NAME('x') 变量名 EQUAL 赋值符 NUMBER(1) 整数字面量 PLUS 加法运算符 NUMBER(2) 整数字面量 NEWLINE 语句结束
💡 类比

就像阅读英文句子时,大脑自动把句子拆成一个个单词,识别每个词的词性。

Token Stream
3
语法分析 Parser → AST
根据语法规则,将 Token 流组装成抽象语法树(AST)。树的结构表达了代码的嵌套和运算优先级。
# ast.dump(ast.parse("x = 1 + 2")) Module(body=[ Assign( targets=[Name(id='x')], value=BinOp( left=Constant(value=1), op=Add(), right=Constant(value=2) ) ) ])
💡 树的意义

AST 让编译器能理解代码结构:1+2*3 会生成正确的嵌套树,乘法节点 deeper than 加法。

AST
4
编译为字节码 Compiler → Bytecode
Python 编译器遍历 AST,生成字节码指令序列。字节码不是机器码,而是 Python 虚拟机能理解的中间指令。
# dis.dis("x = 1 + 2") 0 LOAD_CONST 0 (1) # 把常量 1 压入栈 2 LOAD_CONST 1 (2) # 把常量 2 压入栈 4 BINARY_ADD # 弹出 2 个值,相加,压入结果 6 STORE_NAME 0 (x) # 弹出栈顶,绑定到变量 x
📦 .pyc 缓存文件结构(import 时自动生成)
Magic Number
0x0D0F
Python 版本标识
Timestamp
1713955200
源文件修改时间
Bytecode
marshal 序列化的 code 对象
实际的字节码数据
Bytecode
5
虚拟机执行 PVM Stack Machine
PVM(Python Virtual Machine)是一个栈式虚拟机,通过操作栈来执行字节码。点击下方按钮逐步执行:
LOAD_CONST 1
LOAD_CONST 2
BINARY_ADD
STORE_NAME x
操作栈 Stack
变量表 Names
(空)
Python vs C 编译对比
C 语言Python
编译产物原生机器码中间字节码
执行者CPU 硬件Python 虚拟机(软件)
执行速度⚡ 原生速度🐢 虚拟机开销
跨平台需重新编译字节码通用
类型检查编译期静态运行时动态
一句话总结:Python 的"慢"本质上是因为多了一层虚拟机抽象——每条字节码指令都需要 PVM 去解释、分发、执行,而 C 编译出来的是 CPU 能直接跑的指令。
更准确地说:Python 是 编译 + 解释 的混合模式,不是纯解释型语言。