本页描述了 CPython 中核心对象系统和内存管理机制。它涵盖了 Python 对象在内存中的结构、类型系统、引用计数和垃圾回收。有关解释器状态和并发的详细信息,请参阅 运行时和线程管理。
Python 的对象系统围绕所有对象共享的通用核心结构构建。该结构维护类型信息和引用计数等基本元数据。
来源:Include/object.h59-118 Include/cpython/object.h148-232 Objects/object.c43-63
每个 Python 对象都以一个包含关键元数据的通用头部开始。标准构建和无 GIL 的免费线程构建(禁用 GIL)的具体结构有所不同。
对于变长对象(如列表、元组),基本结构会增加一个额外的字段
来源:Include/object.h110-172 Include/internal/pycore_object.h99-173 Objects/object.c525-568
Python 的类型系统定义了对象的行为。类型本身也是对象(是 type 元类的实例)。
PyTypeObject 结构包含大量定义对象行为的信息。
tp_new、tp_init、tp_call 等)类型系统同时支持静态内置类型(如 int、list)和动态堆类型(通过类定义在运行时创建)。
来源:Include/cpython/object.h148-232 Objects/typeobject.c92-232
Python 采用双管齐下的方法进行内存管理
每个对象都维护一个指向它的引用计数。当计数达到零时,对象将被释放。
在免费线程构建中,引用计数更为复杂
ob_ref_local):由拥有对象的线程管理ob_ref_shared):用于来自其他线程的引用来源:Include/internal/pycore_object.h134-173 Objects/object.c332-520
仅靠引用计数无法处理循环引用(当对象互相引用时)。垃圾回收器负责检测并打破这些循环。
垃圾回收器根据 GIL 是否启用而有不同的工作方式
来源:Include/internal/pycore_gc.h16-81 Python/gc.c60-257 Python/gc_free_threading.c201-331
对象通过几种函数创建
PyObject_New():创建一个特定类型的新对象PyObject_InitVar():创建一个变长对象_PyObject_New():低级分配函数当对象被创建时
当对象的引用计数达到零时
PyObject_CallFinalizerFromDealloc()),可能会调用 tp_finalize()tp_dealloc() 来清理对象终结在对象被释放之前处理清理任务。这对于具有外部资源(如文件句柄)的对象尤为重要。
一些对象被标记为“永生”,这意味着它们永远不会被释放。这些包括
None、True 和 False对永生对象调用 Py_INCREF() 或 Py_DECREF() 没有效果。
来源:Include/internal/pycore_object.h198-229
在免费线程构建中,某些对象使用“延迟引用计数”来减少争用
_Py_REF_DEFERRED)开始这种方法提高了多线程场景下的性能。
来源:Include/internal/pycore_object.h22-28 Python/gc_free_threading.c273-298
Python 对象通常在其字典中存储属性。实现方式因对象类型而异
CPython 的字典使用
来源:Objects/dictobject.c1-106 Include/internal/pycore_dict.h50-106
Python 3.13 引入了在没有全局解释器锁 (GIL) 的情况下运行的实验性支持。这需要对内存管理系统进行重大更改
此模式允许 Python 更好地利用多核 CPU,但会带来一定的性能开销,尤其是在单线程代码中。
来源:Doc/whatsnew/3.13.rst103-115 Include/object.h183-258 Python/gc_free_threading.c34-76
Python 维护着一个稳定的 ABI(二进制接口),以保证跨 Python 版本的二进制兼容性。对象系统中包含在稳定 ABI 中的关键组件包括
Py_INCREF、Py_DECREF 等)稳定的 ABI 函数在代码中标明,并在 Misc/stable_abi.toml 中明确列出。
来源: Misc/stable_abi.toml16-63 PC/python3dll.c16-48 Doc/data/stable_abi.dat1-43
本页面提供了 CPython 对象系统和内存管理的概述。理解这些基础知识对于深入研究 Python 内部和编写高效的扩展至关重要。