Python内存管理机制

对于Python,内存管理涉及所有包含Python的对象和堆。Python内存管理器在内部确保堆的管理和分配。Python内存管理器有不同的组件,可以处理动态存储管理的各个方面,比如* * *共享、分段、预分配或缓存。

在最低级别,原始内存分配器通过与操作系统的内存管理器进行交互,确保堆中有足够的空间来存储所有与Python相关的数据。在最初的内存分配器之上,几个特定于对象的分配器运行在同一个堆上,并实现适合每种对象类型特征的不同内存管理策略。

例如,整数对象在堆中的管理不同于字符串、元组或字典,因为整数意味着不同的存储要求和速度/空间权衡。因此,Python内存管理器将一些工作委托给特定于对象的分配器,但确保后者在堆的边界内运行。

重要的是要明白Python堆的管理是由解释器本身执行的,用户无法控制它,尽管他们经常操纵指向堆中内存块的对象指针。Python内存管理器通过本文档中列出的Python/C API函数按需执行Python对象和其他内部缓冲区的堆空间分配。

为了避免内存崩溃,扩展编写者不要试图用从C库导出的函数来操作Python对象:malloc()、calloc()、realloc()和free()。这将导致C分配器和Python内存管理器混合调用的致命后果,因为它们实现不同的算法,运行在不同的堆上。

在大多数情况下,我们建议从Python堆中分配内存,因为后者由Python内存管理器控制。例如,当用c编写的新对象类型扩展解释器时,这是必要的。使用Python堆的另一个原因是通知Python内存管理器关于扩展模块的内存需求。将所有内存请求委托给Python内存管理器也将从整体上给解释器一个更准确的内存占用。所以在某些情况下,Python内存管理器可能会也可能不会触发适当的操作,比如垃圾收集、内存压缩等等。