CodeWalk

dis模块与Python字节码基础概念

作者:孤独的心 · 2026-05-30 12:55

请介绍Python dis模块的用途和基本用法。解释什么是Python字节码,以及常用字节码指令的含义:LOAD_FASTSTORE_FASTLOAD_CONSTCALL_FUNCTIONPOP_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_FASTLOAD_GLOBAL快?答:LOAD_FAST通过数组索引访问(O(1)),LOAD_GLOBAL需要字典哈希查找(O(1)但常数更大)。这是Python建议将频繁访问的全局变量赋给局部变量的原因。