熟悉C語言的同學(xué)可能對對象的構(gòu)造和析構(gòu)比較熟悉。所謂構(gòu)造函數(shù),就是對類進(jìn)行初始化,而析構(gòu)函數(shù)則是刪除對象,并提供一系列的清掃工作。
對比C語言,Python中的__new__和__init__基本可以完成構(gòu)造函數(shù)的工作,即初始化一個對象。而Python對于對象的垃圾回收則由語言層面來做,不用開發(fā)者顯示操作。今天就來簡單說一下,Python中的垃圾回收。
Python中的垃圾回收主要通過引用計數(shù)、標(biāo)記清除、分代技術(shù)來實(shí)現(xiàn)的:
-
Python中每個對象都有一個叫做ob_refcnt的屬性,用來對該對象的引用進(jìn)行計數(shù),當(dāng)一個對象有了新的引用時(最常見的是被賦值給了一個變量),ob_refcnt屬性加一;相應(yīng)的,當(dāng)一個對象的某個引用被刪除了,它的ob_refcnt會減一。當(dāng)ob_refcnt減到0的時候,就可以將這個對象清除了。這種方法就叫做標(biāo)記清除。它的優(yōu)點(diǎn)是簡單高效,缺點(diǎn)在于對于循環(huán)引用的失效。 - 所謂標(biāo)記清除法,可以理解是先按需分配,等到需要清理空間的時候,去遍歷以對象為節(jié)點(diǎn),引用為邊的圖,將所有可以被訪問到的對象標(biāo)記,未被標(biāo)記的對象則被清除。這種方法可以解決循環(huán)引用帶來的潛在問題。
- 分代技術(shù),將所有對象按照存活時間分為不同的“代”,垃圾回收頻率隨著“代”的存活時間增加而減少。這種方法默認(rèn)的原則是存活越久的對象,需要被垃圾回收的概率就越低。由于提供了按“代”回收的思路,在一定程度上減小了垃圾回收所需要操作的空間范圍,提高了垃圾回收的效率,缺點(diǎn)在于某些高“代”的垃圾不能被實(shí)時清除,也就是犧牲了部分垃圾回收的效果來換取垃圾回收的效率的提升。