系列导读:把 Python 接回计算机基础
学 Python 很容易停在「会用」:会写
list、会调requests、会开线程。但应用开发里的很多问题——为什么pop(0)慢、为什么 GIL 让多线程跑不满 CPU、为什么async里调用requests会卡住整个服务——答案都不在 Python 语法里,而在它下面的计算机基础。
这个系列想做什么
每篇文章都按同一条线索展开:
计算机基础概念
↓
CPython / 标准库怎么实现
↓
应用开发里怎么用
↓
常见坑与边界
↓
动手实验
不是再抄一遍教材,而是回答三个问题:
- 这个概念在 Python 里对应什么?
- Python 的实现和教材里的理想模型差在哪?
- 写业务代码时,这个差异会以什么形式咬你?
文章列表
| 文章 | 核心问题 | 对应课程 |
|---|---|---|
| Python 与数据结构 | list/dict/set/deque/heapq 底层是什么?为什么复杂度不一样? | 数据结构 |
| Python 与操作系统 | 进程、线程、协程、GIL、虚拟内存、文件描述符、信号在 Python 里怎么落地? | 操作系统 |
| Python 与计算机网络 | socket、TCP/UDP、HTTP、TLS、asyncio 之间是什么关系? | 计算机网络 |
| Python 与数据库 | DB-API、事务、索引、连接池、ORM 在 Python 应用里怎么配合? | 数据库系统 |
| Python 与内存管理 | 对象布局、pymalloc、引用计数、分代 GC、弱引用和内存观测怎么串起来? | 操作系统 / 运行时 |
| Python 与编译原理 | 源码怎么变成字节码?dis、闭包、装饰器、import 背后的机制是什么? | 编译原理 |
版本基线
- 语言语义按 Python 3,代码示例以 3.11+ 为基线;3.12 / 3.13 / 3.14 的差异会单独标注。
- 涉及解释器内部实现时,明确限定为 CPython;PyPy、GraalPy 等实现不保证同样的行为。
- 具体的内存布局、分配器参数、默认阈值都可能随版本变化,不要把某一次实测当成永久常量。
容易写死的版本结论
| 结论 | 生效版本 |
|---|---|
| GC 默认阈值 | 3.11/3.12 常见 (700, 10, 10);3.13 常见 (2000, 10, 10) |
| pymalloc arena/pool | 64 位 3.11+ 实测 1 MiB / 16 KiB;更早或 32 位可能不同 |
| 不朽对象 | 3.12+ |
multiprocessing 默认 start method | 3.14 起 POSIX 默认 forkserver(macOS 仍 spawn) |
| free-threaded 构建 | 3.13 实验性;3.14 起官方支持 |
os.process_cpu_count() | 3.13+,尊重 CPU 亲和性 |
怎么读
- 每篇独立,可以按需跳读;侧边栏顺序是「数据结构 → 操作系统 → 计算机网络 → 数据库 → 内存管理 → 编译原理」。
- 代码块分两类:完整示例可以直接运行;带
...或未定义名字的是片段,会明确标注「片段」或「伪代码」。 - 每篇末尾的「动手实验」建议真的跑一遍,尤其是
timeit、sys.getsizeof、ss、curl -v这类能直接看到差异的命令。
和仓库里其它笔记的关系
- 语法速查:Python 速查。
- 语言特性与标准库的零散笔记:Python 学习笔记。
- 算法题与数据结构实现:数据结构 与 题库。
- 本系列不重复这些内容,而是补上「Python 代码下面那层计算机系统」。
姊妹系列
Java 版用同一套骨架讲 JVM、字节码、GC 和 JIT:Java 与计算机基础。
旧笔记里「每 100 条字节码释放一次 GIL」和「字符串
+=必然 O(n²)」两处已经过时,已按本系列《操作系统》§3 和《编译原理》§8 修正。