對於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內存管理器可能會或可能不會觸發適當的操作,如垃圾收集,內存壓縮等。