《Python高级编程》目录

《Python高级编程》全书导航页:说明高级卷在 Python 三卷体系中的定位、读者画像与前置知识,梳理 11 章从对象模型到生态演进的纵深线,并按章列出全部 33 节的完整索引,另交代全书 3.14.6 实测口径、两条阅读路径与延伸阅读方向,帮你从会用走到懂原理。

这是 Python 三卷体系里的最后一卷。入门卷回答「会不会写」,实战卷回答「能不能交付」,而本卷回答的是那个绕不开的问题:你每天调用的这些语法与库,底下到底是怎么运转的。

本卷的立场是「原理与机制」——不是把语法再讲一遍,而是拆开 CPython,看清每个行为背后的实现与取舍。

《Python高级编程》目录

这一页是高级卷的总入口。它不只列出章节标题,还交代了三卷之间的关系、本卷的读者画像、11 章之间那条纵深线,以及两条可以直接照着走的阅读路径。如果你不确定从哪切入,先读「三卷之间的关系」与「读者画像」,再看「阅读路径」;如果你已经有明确目标,直接跳到「分章章节」按编号定位。

全书结构是:11 章 × 3 节 = 33 节 + 本目录篇,共 34 篇。正文不分「部分」,而是一条从对象模型一路下探到生态演进的纵深线:先讲对象与元编程,再下探解释器与运行时,然后是导入、类型与扩展的边界,最后落到性能与分发。

如何使用本目录

这一页有三种用法,取决于你此刻的状态:

刚开始读:按顺序看「三卷之间的关系」「读者画像与前置知识」「两条阅读路径建议」,用五分钟决定自己的入口章节。本卷信息密度高、抽象层数深,选错入口比读得慢更浪费时间。

读到一半,想查某一节在哪:直接看「分章章节」里对应章的表格。每一行都有一句话说明,可以帮你确认是不是你要找的那一节。

把它当手册用:本卷更适合「带着问题回查」。遇到「为什么这么设计」的疑问时,先在这里定位到章节,再进正文看实现细节与实测数据。

三卷之间的关系

三卷不是三本可以随意挑选的书,而是一条有先后依赖的能力链。先用一张表把分工说清楚:

卷回答的问题典型内容读完后能做什么
《Python编程入门》会不会写语法、类型、模块、异常、迭代、标准库、基础工程能独立写出结构清晰、可测试的小程序
《Python编程实战》会不会交付脚手架、Web 后端、数据与自动化、部署与运行能从空目录做出一个可上线、可运维的服务
《Python高级编程》(本卷)懂不懂原理对象模型、元编程、解释器与运行时、并发内核、性能深水区能读懂底层机制、做架构级取舍、读得进 CPython 源码

入门卷给你「零件」,实战卷教你「怎么把零件装成一台能跑的机器」,而本卷带你拆开机器,看清里面每个齿轮为什么这样咬合。三卷的关系是层层递进的:入门卷把语言讲透,实战卷假定你会写、把重点搬到工程决策,本卷则假定你已经交付过项目,把重点搬到「机制」——为什么这样设计、代价是什么、什么条件下会失效。

本卷与实战卷最大的区别在知识来源。实战卷的内容来自工程实践,本卷的内容则要求来自三处:CPython 的实现细节、亲手实测出来的现象、以及版本之间的行为差异。凡是能在这三处找到新信息的地方,本卷就展开;否则宁可换一个切入角度,也不把语法重排一遍。这正是本卷相对站内 Python 专题的价值所在——专题讲「怎么用」,本卷讲「为什么是这样」。

如果你想先补齐前置知识,可以回到 《Python编程入门》目录 与 《Python编程实战》目录 对照阅读;例如并发基础看 GIL 与线程/进程模型 ,异步基础看 async/await 与事件循环 ,打包基础看 构建 wheel、入口点与发布 PyPI ,剖析方法论看 剖析方法论 。

读者画像与前置知识

本卷面向的是「写过真实 Python 项目,但想弄懂 CPython 内部机制」的人。你可以对照下面几类找到最接近自己的入口。

已经交付过生产项目:你能熟练用 Python 写服务、写脚本,也能用工具链管理依赖与测试。你最大的收获会来自第 1、2 章与第 3、4 章——对象模型与元编程解释了你写过的框架为什么那样设计,解释器与内存管理解释了你遇到过的那些「莫名其妙」的性能现象。

有 C / C++ / Rust 等系统语言背景:你熟悉内存与编译,但 CPython 的引用计数、对象头、字节码专门化对你仍是陌生的。建议快速扫过语言层面的内容,把精力放在第 3 章到第 6 章的运行时机制,以及第 9 章的跨语言扩展。

框架 / 库的维护者:你需要控制类的创建、拦截导入、改写类型检查,元编程与描述符是你的主战场。第 1、2、7、8 章优先级最高,其余章按需补读。

时间有限、只想弄懂一块:本卷每一节都能单独成篇,因为每节都从「本节目标」起手、以「小结」收束。你可以先看「常见问题速查」定位到最痛的那个问题对应的章节,读完再决定要不要补相邻章节。

前置知识有三条底线:能熟练使用命令行与虚拟环境;理解模块、类、异常、迭代协议与上下文管理器;写过至少一个带类型注解和测试的项目。若这三条有欠缺,先回入门卷补课比硬读本卷更省时间。

11 章的纵深线

本卷不分「部分」,因为 11 章不是四块拼图,而是一条从抽象到具体、从语言层到系统层的纵深线。下表说明每个阶段的位置与它回答的问题:

阶段章节主题回答的问题
建模层第 1–2 章对象模型与元编程对象到底是什么?类是怎么被造出来的?
运行层第 3–6 章字节码、内存、并发、异步代码怎么被执行?内存与并发怎么运转?
边界层第 7–9 章导入、类型、扩展模块与类型系统的边界在哪?怎么跨语言?
工程层第 10–11 章性能与分发怎么量化优化?怎么交付与演进?

这条线有一个内在顺序:先建立正确的对象心智模型(第 1–2 章),再下探运行时(第 3–6 章),然后处理跨边界的机制(第 7–9 章),最后落到可量化的工程实践(第 10–11 章)。 前一个阶段是后一个阶段的地基——不懂描述符就读不透属性访问的开销,不懂引用计数就理解不了内存优化,不懂 GIL 就判断不了并发选型。

不过,这条线并不要求严格顺序阅读。每一章都尽量自足:第 4 章讲内存时会顺带回顾第 1 章的对象头,第 10 章讲性能时会回头引用第 3 章的字节码。如果你已经有明确目标,可以直接跳到对应章节,再沿「衔接下一节」那句话往前后补。

本卷的版本口径

本卷所有实测数据的基线是 Python 3.14.6(2026-06 构建,本机标准构建)。书中代码以 Python 3.12 为最低版本(requires-python = ">=3.12"),涉及版本差异的地方会同时给出 3.12 / 3.13 / 3.14 的行为边界。

有一条必须提前说清楚:本机是标准构建,不是自由线程构建,也没有启用实验性 JIT。 因此:

  • 第 3.3 章、第 10.3 章涉及 JIT 的部分,都先实测了本机 sys._jit.is_available() 为 False,再讲原理与版本演进,没有给出 JIT 的本机性能数字。
  • 第 5.2 章、第 11.2 章涉及自由线程(PEP 703)的部分,都如实标注了「本机非自由线程构建」,用「标准构建下的行为实测」加「官方设计说明」对照讲解,不会把没跑过的输出当成实测结果。
  • 第 9.3 章涉及 Rust 扩展的部分,因本机没有 Rust 工具链,只能给构建流程说明与等价的最小 cffi 对照,并显式标注「本机未实测」。

凡是贴出的输出,都是真实跑出来的;凡是跑不了的,正文都会写明原因。这一点在阅读时可以放心。

分章章节

下面按 11 章列出全部 33 节,每一行给出编号、标题与一句话说明。编号规则是「章.节」,例如 8.2 表示第 8 章第 2 节;点击标题即可进入该节正文。

每一章开头都有一段导读,说明它在纵深线中的位置;如果你只想知道某节讲什么,直接看表格第三列的说明即可。

第 1 章 对象模型与数据模型

从最底层的心智模型开始:一切都是对象,对象有类型、标识与引用。这一章拆开 obj.attr 与 a + b 这些日常操作背后的查找与协议,是后面所有章节的地基。

节章节说明
1.1一切皆对象:类型、标识与引用从 id/type/getsizeof 实测 PyObject 的引用计数与类型指针,用 getrefcount 看 3.12+ 的不朽对象(PEP 683)
1.2属性查找、描述符协议与 __getattr__拆开 obj.attr 的查找顺序:数据描述符、实例字典、非数据描述符的优先级,用 dis 说明 __slots__ 的底层实现
1.3魔术方法驱动的协议设计从协议角度讲 dunder:隐式调用只在类型上查找、迭代与比较协议的回退、NotImplemented 触发的反射运算与子类优先

第 2 章 元编程

第 1 章讲对象怎么被访问,这一章讲类本身怎么被创造。元类、类装饰器与 AST 变换是三条「控制类创建」的路径,也是很多框架魔法的来源。

节章节说明
2.1元类与 __init_subclass__拆解 class 语句如何脱糖成 __build_class__ 与 type(),元类各钩子与 __set_name__/__init_subclass__ 的精确执行顺序
2.2类装饰器、__set_name__ 与属性工厂讲清类装饰器与 __set_name__ 的执行时机,用属性工厂与 __init_subclass__ 实测一个字段收集框架
2.3动态代码生成与 AST 变换从字符串拼接升级到 AST 变换,用 NodeTransformer 改写 assert 并实测改写前后的 dis 字节码差异

第 3 章 字节码与解释器

从这里开始下沉到运行层。第 3 章看清 CPython 怎么把源码编译成字节码、又怎么执行字节码,是理解后续内存与性能的前提。

节章节说明
3.1CPython 执行模型与字节码深入栈式虚拟机:求值栈与指令编码、dis 的栈效应计算、异常表,以及 3.11+ 自适应专门化如何改写 LOAD_ATTR
3.2dis / bytecode 与运行时代码改写实测运行时代码改写三条路径:改 co_code、用 bytecode 注入计数器、sys.monitoring,并对照各自开销
3.3实验性 JIT 与自适应解释器先实测本机 JIT 未启用,再拆开三层执行体系:自适应专门化、Tier 2 微操作 IR 与 copy-and-patch 机器码

第 4 章 内存管理与 GC

对象活在内存里,这一章讲清 CPython 怎么分配与回收它们:引用计数为主、循环 GC 为辅,以及对象布局如何决定内存占用。

节章节说明
4.1引用计数、循环 GC 与分代回收用 getrefcount 实测引用数增减,看清循环引用为何让 refcount 失败,再用 gc 实测三代阈值与回收数
4.2对象布局、__slots__ 与内存占用测量用 getsizeof 逐类实测字节数,给出反直觉结论:__slots__ 省下的是整块 __dict__,并用百万实例对照
4.3内存泄漏定位用 tracemalloc 快照对比把泄漏定位到具体行,再用 objgraph 的 show_growth 与 find_backref_chain 画出引用链

第 5 章 并发模型深水区

有了内存模型,就能讲清并发。这一章从 GIL 的实现讲到自由线程的迁移,最后落到多进程与共享内存的选型。

节章节说明
5.1GIL 的实现与影响边界从源码机制拆解 GIL:为何必须持有全局锁、切换间隔怎样在安全点释放线程,并实测 CPU 与 I/O 密集的边界
5.2自由线程构建与迁移影响交代本机并非自由线程构建,从 PEP 703 的对象头改造与延迟引用计数讲清如何维持内存安全
5.3多进程、共享内存与 IPC 选型用实测数字拆解多进程的三笔开销,用 shared_memory 实测零拷贝共享,给出线程池与进程池的选型决策表

第 6 章 异步运行时原理

并发不只线程与进程,还有单线程的事件循环。这一章把 asyncio 拆到调度器层:循环怎么跑、任务怎么被取消、结构化并发怎么组织。

节章节说明
6.1事件循环的实现与调度用 selectors 手写最小事件循环,对照 BaseEventLoop._run_once 讲清双队列设计与 call_soon/call_later 的优先级
6.2任务、Future 与取消语义从源码讲清 Task 与 Future 的关系、Future 的三态机、cancel() 的注入点与 shield 的保护边界
6.3结构化并发与调试对比 TaskGroup 与 anyio 的结构化并发,讲清异常组如何打包传播、timeout 语义与慢回调警告等调试手段

第 7 章 导入系统与包机制内部

运行层讲完,进入边界层。第 7 章拆开 import 这个每天都在用、却很少有人真懂其机制的关键字。

节章节说明
7.1导入协议与 finder / loader从实现层拆开 import:sys.meta_path 上三个默认 finder 的查找顺序、三阶段协议与 sys.modules 的缓存时序
7.2元路径钩子与自定义导入器亲手实现 MetaPathFinder 与 Loader,实测 sys.path_hooks、.pth 与 sitecustomize 的触发时机
7.3命名空间包、zip 导入与冻结模块实测 PEP 420 命名空间包的动态 __path__、相对导入解析、zipimport 与冻结模块的 origin 归属

第 8 章 类型系统运行时边界

类型注解不只是给静态检查器看的,它在运行时也是真实对象。这一章把注解、泛型与描述符当作运行时机制来讲,重点落在 3.14 的注解求值时机变更上。

节章节说明
8.1描述符协议与属性查找下沉到 C 实现层:object 与 type 两个 __getattribute__、元类上的描述符优先级,并实测属性访问开销
8.2typing 的静态与运行时边界把注解里的类型当运行时对象看:GenericAlias、3.14 的联合类型合并、get_origin/get_args 与 Annotated
8.3注解的求值时机(PEP 649/749)实测 3.14 的 PEP 649/749:注解延迟求值、__annotate__、annotationlib 三种 Format 与缓存行为

第 9 章 扩展与跨语言

当纯 Python 不够快、或需要复用已有的 C/Rust 库时,就要跨出解释器。这一章讲清三条扩展路径的机制与代价。

节章节说明
9.1ctypes 与 cffi 调用 C从 dlopen 加载符号讲起,实测 ctypes 的 errno、内存所有权与 Structure 布局,并对比 cffi 的 ABI/API 两种模式
9.2Cython 与 NumPy 加速实测 Cython 3.3.0 编译流程:cdef 声明的加速比、cython -a 的调用密度注释、闭式化现象与内存视图 nogil
9.3PyO3 与 Rust 扩展讲清 PyO3 用 Rust 写扩展的架构:Bound 把 GIL 生命周期编进类型、detach 释放 GIL、abi3 与 maturin 分发

第 10 章 性能工程

前三章处理机制,这一章处理「怎么量化」。性能工程的核心纪律是先测量再优化,这一章把剖析、内存优化与自适应特化串成一条证据链。

节章节说明
10.1剖析器内部与采样原理从内部拆解三种剖析钩子,实测三者开销倍率,得出「开销正比于函数调用次数」这一结论
10.2内存优化与数据结构选型用两种口径把省内存量化到底:各容器装百万整数的字节数、字符串驻留、生成器把峰值压到极小
10.3自适应特化与 JIT 现状用 dis(adaptive=True) 实测冷启动与预热后的字节码差异,拆开专门化族并实测本机 JIT 状态

第 11 章 分发、运行时与生态演进

最后一章把能力交出去:打包成 wheel、嵌入或独立分发运行时,再回到宏观视角看 PEP 流程与版本迁移。它收束全书,也给出继续深入的方向。

节章节说明
11.1打包与分发机制用 uv build 真打一个包,逐文件拆开 wheel 的 .dist-info、entry_points 与 PEP 517 钩子调用顺序
11.2嵌入式与自由线程运行时真编译一个 C 宿主嵌入 CPython,实测 Py_Initialize 等调用,再对比标准与自由线程构建的对象布局
11.3PEP 流程与版本迁移策略从 PEP 状态机讲起,用 __future__ 与 warnings.deprecated 实测弃用周期,逐条实测 3.14 迁移点

两条阅读路径建议

本卷可以按顺序纵深读,也可以按已有基础跳读。下面给出两条典型路径,其余组合可以按前面的纵深线表自行裁剪。

两条路径并不互斥:你也可以先按基础跳读完一条支线,再回头把剩下的章补齐。关键在于每读一节都动手,把示例在自己的环境里跑一遍——原理是靠复现验证的,不是靠记忆记住的。

路径一:从头纵深读(推荐给第一次系统接触 CPython 内部的人)。 从 1.1 一路读到 11.3,按「建模层 → 运行层 → 边界层 → 工程层」的顺序推进。这条路线的价值在于它模拟了理解一个运行时的自然顺序:先建立对象心智模型,再看代码怎么被执行,然后处理跨边界的机制,最后落到可量化的工程实践。你会经历一次「从对象到运行时」的完整下探,这正是本卷最重要的产出。预计投入 6–8 周,每天 1 小时。

路径二:按已有基础跳读(推荐给有明确目标的框架作者与性能工程师)。 先读第 1 章的 1.1、1.2 两节,建立共同的对象模型底座,然后按方向选一条支线:

  • 框架 / 库维护者:第 2 章(元编程)→ 第 7 章(导入机制)→ 第 8 章(类型与描述符),这条线覆盖了绝大多数框架魔法的实现。
  • 性能 / 基础设施方向:第 3 章(字节码)→ 第 4 章(内存)→ 第 10 章(性能工程),这条线从执行模型一路连到可量化的优化。
  • 并发 / 异步方向:第 5 章(并发模型)→ 第 6 章(异步运行时),这条线把线程、进程与事件循环的边界讲透。

跳读时请留意每章开头交代的定位,以及各节末尾「衔接下一节」那句话——它往往点明本节的知识被谁消费。

无论选哪条路径,第 11 章都建议放在最后读一遍。它把前面 10 章的机制收拢到「交付与演进」这个落点上,从打包、嵌入式运行时一路讲到 PEP 流程,是检验「是否真的把机制串起来了」的最好方式。

常见问题速查

下面是读本卷时常遇到的「该读哪一节」的问题,直接给答案:

你的问题去哪一节
想知道 a is b 和 a == b 到底差在哪1.1、1.3
框架的 @decorator 类魔法看不懂2.1、2.2
想拦截、改写别人写的代码2.3、3.2
想知道一行 Python 编译成了什么3.1、3.2
循环里 a.b 为什么比局部变量慢1.2、8.1、10.3
内存一直涨、怀疑泄漏4.1、4.3、10.2
想弄清 __slots__ 到底省不省内存4.2
多线程为什么没变快5.1
自由线程版 Python 到底能不能用5.2、11.2
该用线程、进程还是异步5.3、6.1
任务取消了却没停、shield 不生效6.2
ModuleNotFoundError 想从机制上根治7.1、7.2
命名空间包、zip 部署怎么加载模块7.3
注解在运行时为什么是那个样子8.2、8.3
3.14 升级后注解相关代码报错8.3、11.3
想用 C/Rust 给 Python 加速9.1、9.2、9.3
剖析器该怎么选、开销多大10.1
想读懂打包出来的 wheel 里有什么11.1

如果你遇到的问题不在表里,可以先用目录里的关键词搜索定位章节,再结合每节的「本节目标」判断是否命中。

延伸阅读

本卷讲的是「原理与机制」,站内 Python 专题则是「单点应用」。两者是互补关系:本卷负责把机制串成一条线,专题负责就一个问题钻到底。几组高相关的组合:

需要更完整的学习路线,可以回到入门卷的 《Python编程入门》目录 与实战卷的 《Python编程实战》目录 对照阅读。

读完本卷之后

读完全书并不意味着结束。机制层面的理解,真正让它固化的,是你拿它去解释自己遇到过的现象、去读你依赖的库的源码。给几条后续建议:

  • 带着一个真实疑问回来。读的时候记下那些「原来如此」的时刻,读完后挑一个最想验证的,自己写段最小代码跑一遍——本卷的每个结论都欢迎被复现。
  • 读一读 CPython 的源码。第 3 到 6 章涉及的对象模型、字节码、GC 与事件循环,都能在 CPython 仓库里找到对应实现;对照本卷讲到的模块名去读,会比从头读源码高效得多。
  • 保持对版本差异的敏感。本卷反复出现的「3.12 / 3.13 / 3.14 行为不同」不是细节,而是你升级依赖时的判断依据;养成查 What's New 的习惯。
  • 别把机制当成炫技。懂原理是为了做出更好的取舍,而不是为了写出更复杂的代码;可维护性永远优先于技巧。

小结

这一页的核心信息可以浓缩成三句话:

  • 定位上,本卷是 Python 三卷体系的最后一卷,把实战卷的「会交付」升级为「懂原理」,内容要求来自 CPython 实现、亲手实测与版本差异三处新信息。
  • 结构上,全书是「11 章 33 节 + 本目录篇」,不分部分,而是一条从对象模型到生态演进的纵深线:建模层、运行层、边界层、工程层依次展开。
  • 路径上,第一次系统接触 CPython 内部建议从头纵深读,框架作者与性能工程师可按方向跳读,但第 11 章都值得最后读一遍。

如果你已经选好了路径,可以直接从对应的章节开始。每一节末尾都会指向下一节,跟着走不会迷路。

祝你读得顺利。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「python」更多文章

  1. 《Python高级编程》11.3 PEP 流程与版本迁移策略
  2. 《Python高级编程》11.2 嵌入式与自由线程运行时
  3. 《Python高级编程》11.1 打包与分发机制