Python緩存機制
1. 什么是緩存機制
Python對象在創(chuàng)建的時候,會為其開辟一個內(nèi)存,當(dāng)變量引用該對象時,實際上是指向該對象的內(nèi)存地址,當(dāng)該對象不在被引用,會被垃圾回收機制回收,釋放內(nèi)存。但是Python為了解決對象創(chuàng)建—開辟內(nèi)存,對象回收—釋放內(nèi)存這么一個對內(nèi)存反復(fù)操作導(dǎo)致時間的浪費,就有了緩存池這一概念來管理一些常見的對象,當(dāng)對象的引用計數(shù)為0時,他從refchain鏈表中刪除,并不是直接銷毀,而是放到了一個free_list的鏈表中進行緩存,當(dāng)出現(xiàn)一個類型相同的對象時,直接用他的上一個對象的內(nèi)存地址,只需在refchain中對其值進行初始化即可。
2. 緩存池機制
Python在啟動時,會創(chuàng)建一部分對象并將他們放置緩存池中,當(dāng)引用這些對象時,不會重新創(chuàng)建,而是直接引用緩存,如整型[ -5 —256 ],布爾類型,字符串類型
1. 整型
2. 布爾類型

3. 字符串

3. 駐留機制
1. python的駐留機制是python系統(tǒng)內(nèi)部維護了一個叫 “interned” 的字典,當(dāng)允許被駐留的數(shù)據(jù)首次創(chuàng)建時,會被記錄到該字典中,如果在 “同一個代碼塊中(代碼塊可以是一個模塊,一個函數(shù),一個類,一個文件)” 該數(shù)據(jù)被刪除或者被其他對象再次引用時,不開辟新的內(nèi)存空間,而是直接指向駐留空間中的內(nèi)存地址,這樣可以大量的節(jié)省內(nèi)存空間。不同版本的駐留機制可能不太相同,以3.7版本為例:整型、浮點型、布爾型,字符型都滿足駐留機制。
舉個例子:
當(dāng)a = 11111,b 也引用11111這個對象,則b的地址直接執(zhí)行11111的內(nèi)存地址,不在重新創(chuàng)建新的內(nèi)存地址
元組,列表,集合,字典他們不符合駐留機制,即使他們的元素內(nèi)容相同,所執(zhí)行的內(nèi)存地址也是不相同的,但是空元組的內(nèi)存地址卻是相同的。
元組:

列表:

4. free_list機制
free_list機制是對特定的數(shù)據(jù)類型的緩存而進行的存儲鏈表,如[-5 — 256 ]外的整型、大于0的浮點型、以及列表,集合,元組和字典,當(dāng)我們引用計數(shù)器為0時,應(yīng)該啟用垃圾回收機制回收該內(nèi)存空間,但實際上python并沒有直接回收,“在不同的代碼塊中(注意)” 而是將對象添加到一個叫 “free_list” 的列表中作為緩存,這個機制就叫做 “free_list機制”。這是做什么呢?這就是為了在以后再創(chuàng)建對象時,不再重新開辟內(nèi)存,而是使用 free_list 中的內(nèi)存空間。
舉個例子
s1 = 333 (id(s1),內(nèi)存地址是2253215090224)
del s1 刪除s1,則333這個對象的引用技術(shù)為0,從refchain鏈表中刪除,將這個類型的內(nèi)存地址放在了free_list中
s2 = 666 (id(s2),內(nèi)存地址為2253215090224),指向了在free_list中緩存的地址,只是將內(nèi)存地址初始化重新賦值放到refchain鏈表中

但是,對于小于0的浮點數(shù),則不會進入free_list中緩存,而是直接進行回收,創(chuàng)建的時候在開辟內(nèi)存

1. 元組的緩存機制
元組的緩存利用下標進行,最大索引是20,即元組的元素最大不超過20個,每個索引的鏈表存儲這相同元素數(shù)量的對象,每個鏈表最多存儲2000個對象,也就是說(1,2,3,4)和('a','b',1,2)是在相同的索引鏈表中存儲,當(dāng)一個元組對象被刪除或者創(chuàng)建時,他會去和元組中元素個數(shù)相同的索引下去尋找是否存在空閑的地址,存在則引用該地址重新賦值即可。

代碼結(jié)果:

2. 列表的緩存機制
列表和元組的free_list機制不同,列表的緩存數(shù)量最多為80個,超出則進行回收

3. 字典的緩存機制
字典的機制和列表是一樣的,最多為80個

浙公網(wǎng)安備 33010602011771號