0

0

Python 字节码执行流程解析

冷炫風刃

冷炫風刃

发布时间:2026-03-04 12:42:41

|

601人浏览过

|

来源于php中文网

原创

python字节码由cpython虚拟机解释执行,流程为源码→编译成.pyc(含魔法数、时间戳、code object等)→加载为code object→pvm基于栈逐条执行指令,所有运行时对象存于堆中,由帧对象管理引用。

python 字节码执行流程解析

Python 字节码不是直接由硬件运行的机器码,而是由 Python 虚拟机(CPython 的 PVM)解释执行的中间表示。理解其执行流程,关键在于看清“源码 → 编译 → 字节码 → 解释执行”这四个环节中每一步做了什么、谁在参与、以及数据如何流转。

源代码被编译成字节码(.pyc 文件)

当你运行 python script.py 或导入一个模块时,CPython 会先检查是否存在对应时间戳更新的 __pycache__/script.cpython-312.pyc(版本号因 Python 版本而异)。若不存在或过期,就调用内置的编译器将源码解析为抽象语法树(AST),再优化并生成字节码指令序列。

你可以手动触发编译:

  • import py_compile; py_compile.compile('script.py')
  • python -m py_compile script.py

生成的 .pyc 文件本质是二进制容器,包含魔法数、时间戳、源码路径和真正的字节码(co_code 字段)。

立即学习Python免费学习笔记(深入)”;

字节码以 code object 形式加载进内存

执行前,Python 将 .pyc 中的字节码载入为一个 code object(不可变对象),它还携带了常量表(co_consts)、变量名(co_names)、局部名(co_varnames)、栈需求(co_stacksize)等元信息。这些信息共同决定虚拟机如何执行该段字节码。

例如,执行 dis.dis(lambda x: x + 1) 会显示:

Lexica
Lexica

一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。

下载
  • LOAD_FAST(从局部变量槽取 x)
  • LOAD_CONST(从 co_consts 取整数 1)
  • BINARY_ADD(执行加法)
  • RETURN_VALUE(返回结果)

每条指令都依赖 code object 提供的上下文才能正确寻址和操作。

PVM 按顺序读取并执行字节码指令

Python 虚拟机是一个基于栈的解释器。它维护一个求值栈(evaluation stack)和当前帧对象(frame object),帧中保存局部变量、上层帧引用、指令指针(f_lasti)等。PVM 循环执行:读取下一条指令 → 解析操作码与参数 → 调用对应逻辑(如 Pyeval_EvalFrameDefault 中的 switch-case 分支)→ 更新栈与状态 → 移动指令指针。

典型行为包括:

  • 遇到 LOAD_NAME:查 globals/locals 字典,压栈
  • 遇到 CALL_FUNCTION:弹出参数和函数对象,新建帧并跳转执行
  • 遇到 JUMP_ABSOLUTE:修改 f_lasti 实现跳转(支撑循环与条件)

没有 JIT,纯解释执行;每条字节码指令背后都是 C 函数调用,开销可见。

执行结果由帧对象和对象系统承载

字节码本身不存储数据,所有运行时对象(int、list、function 等)都分配在堆上,由引用计数 + 垃圾回收管理。帧对象只存指向这些对象的指针。比如 a = [1, 2] 对应的字节码会创建 list 对象并把地址写入局部变量槽,后续 a.append(3) 则通过该指针调用对象方法。

函数调用、异常抛出、生成器挂起等高级行为,也都映射为帧状态变更(如 f_back、f_exc_info、f_gen 等字段赋值),而非字节码直译。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

566

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

440

2024.03.13

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号