dis模块与Python字节码基础概念
请介绍Python dis模块的用途和基本用法。解释什么是Python字节码,以及常用字节码指令的含义:LOAD_FAST、STORE_FAST、LOAD_CONST、CALL_FUNCTION、POP_JUMP_IF_FALSE等。
回答
孤独的心
什么是字节码?
Python源代码首先被编译为字节码(bytecode),然后由CPython虚拟机解释执行。字节码是平台无关的中间表示,存储在.pyc文件中。
dis模块
dis模块用于反汇编Python代码为字节码指令:
import dis
def add(a, b):
return a + b
dis.dis(add)
输出:
2 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_OP 0 (+)
8 RETURN_VALUE
常用字节码指令
变量访问
LOAD_FAST:加载局部变量(通过索引访问,最快)STORE_FAST:存储到局部变量LOAD_GLOBAL:加载全局变量(较慢,需字典查找)LOAD_NAME:加载局部/全局/内置变量(最慢,多作用域搜索)LOAD_ATTR:加载属性(obj.attr)LOAD_CONST:加载常量(数字、字符串、元组等)
控制流
POP_JUMP_IF_FALSE:栈顶为False时跳转POP_JUMP_IF_TRUE:栈顶为True时跳转JUMP_FORWARD:无条件向前跳转JUMP_ABSOLUTE:跳转到指定字节码偏移FOR_ITER:for循环迭代
函数调用
CALL_FUNCTION:调用函数MAKE_FUNCTION:创建函数对象RETURN_VALUE:返回值
实用命令
# 反汇编模块
python -m dis my_module.py
面试常问
为何LOAD_FAST比LOAD_GLOBAL快?答:LOAD_FAST通过数组索引访问(O(1)),LOAD_GLOBAL需要字典哈希查找(O(1)但常数更大)。这是Python建议将频繁访问的全局变量赋给局部变量的原因。