你有没有想过,Python创建一个小整数或短字符串时,为什么不会每次都去找操作系统要内存?这背后藏着CPython的一个关键设计——内存池。

操作系统通过系统调用管理硬件资源,内存也不例外。C库的malloc函数把这些系统调用包装成通用分配器,这构成了内存管理的第0层。CPython没有止步于此,而是在上面搭了三层自己的架构。

打开网易新闻 查看精彩图片

最底层是本文的主角:Layer 1的内存池(pymalloc),专门拦截512字节以下的内存请求。往上是Layer 2的统一对象分配器,通过PyMem_XXXX接口为对象分配内存。最顶层是Layer 3的对象专属优化,比如浮点数的空闲对象缓存池。

打开网易新闻 查看精彩图片

为什么Python不直接用malloc?三个原因:频繁创建销毁对象带来的压力、内存碎片问题、以及malloc在各平台性能差异巨大。

内存碎片的危害很直观。假设系统空闲内存总共1900K,但被切成100K、200K、1600K三块不连续的碎片。这时申请1000K的连续内存会直接失败——尽管空闲总量足够,却没有一块能满足需求。

打开网易新闻 查看精彩图片

CPython的内存池正是为了解决这个问题。它预分配固定大小的内存块,把小块请求集中管理,既减少了向操作系统申请的次数,也避免了碎片化的恶性循环。这个设计让Python在大量小对象场景下保持了稳定的性能表现。