跳到主要内容

系列导读:把 Python 接回计算机基础

学 Python 很容易停在「会用」:会写 list、会调 requests、会开线程。但应用开发里的很多问题——为什么 pop(0) 慢、为什么 GIL 让多线程跑不满 CPU、为什么 async 里调用 requests 会卡住整个服务——答案都不在 Python 语法里,而在它下面的计算机基础。

这个系列想做什么​

每篇文章都按同一条线索展开:

计算机基础概念
↓
CPython / 标准库怎么实现
↓
应用开发里怎么用
↓
常见坑与边界
↓
动手实验

不是再抄一遍教材,而是回答三个问题:

  1. 这个概念在 Python 里对应什么?
  2. Python 的实现和教材里的理想模型差在哪?
  3. 写业务代码时,这个差异会以什么形式咬你?

文章列表​

文章核心问题对应课程
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/pool64 位 3.11+ 实测 1 MiB / 16 KiB;更早或 32 位可能不同
不朽对象3.12+
multiprocessing 默认 start method3.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 修正。

加载评论中...