《原神攻略》金蘋果群島第二階段水泡位置一覽
阿新 • • 發佈:2021-06-25
ython作為一門解釋型語言,以程式碼簡潔易懂著稱。我們可以直接對名稱賦值,而不必宣告型別。名稱型別的確定、記憶體空間的分配與釋放都是由python直譯器在執行時進行的。python這一自動管理記憶體功能極大的減小了程式設計師負擔,這也是成就python自身的重要原因之一。
Python的垃圾回收機制
一、引用計數
Python中,主要通過引用計數(Reference Counting)進行垃圾回收。
typedef struct_object {
int ob_refcnt;
struct_typeobject *ob_type;
} PyObject;
在Python中每一個物件的核心就是一個結構體PyObject,它的內部有一個引用計數器(ob_refcnt)。程式在執行的過程中會實時的更新ob_refcnt的值,來反映引用當前物件的名稱數量。當某物件的引用計數值為0,那麼它的記憶體就會被立即釋放掉。
以下情況是導致引用計數加一的情況:
- 物件被建立,例如a=2
- 物件被引用,b=a
- 物件被作為引數,傳入到一個函式中
- 物件作為一個元素,儲存在容器中
下面的情況則會導致引用計數減一: - 物件別名被顯示銷燬 del
- 物件別名被賦予新的物件
- 一個物件離開他的作用域
- 物件所在的容器被銷燬或者是從容器中刪除物件
我們還可以通過sys包中的getrefcount()來獲取一個名稱所引用的物件當前的引用計數(注意,這裡getrefcount()本身會使得引用計數加一)
sys.getrefcount(a)
引用計數法有其明顯的優點,如高效、實現邏輯簡單、具備實時性,一旦一個物件的引用計數歸零,記憶體就直接釋放了。不用像其他機制等到特定時機。將垃圾回收隨機分配到執行的階段,處理回收記憶體的時間分攤到了平時,正常程式的執行比較平穩。但是,引用計數也存在著一些缺點,通常的缺點有:
- 邏輯簡單,但實現有些麻煩。每個物件需要分配單獨的空間來統計引用計數,這無形中加大的空間的負擔,並且需要對引用計數進行維護,在維護的時候很容易會出錯。
- 在一些場景下,可能會比較慢。正常來說垃圾回收會比較平穩執行,但是當需要釋放一個大的物件時,比如字典,需要對引用的所有物件迴圈巢狀呼叫,從而可能會花費比較長的時間。
- 迴圈引用。這將是引用計數的致命傷,引用計數對此是無解的,因此必須要使用其它的垃圾回收演算法對其進行補充。
也就是說,Python 的垃圾回收機制,很大一部分是為了處理可能產生的迴圈引用,是對引用計數的補充。