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