快取機制和小資料池

2021-09-22 16:44:29 字數 2491 閱讀 6278

a=1

print(id(a)) #1521708048

如何判斷兩個變數是否是乙個值呢?

== 是比較的兩邊的數值是否相等,而 is 是比較的兩邊的記憶體位址是否相等。 如果記憶體位址相等,那麼這兩邊其實是指向同乙個記憶體位址,那麼這兩個變數其實就是乙個值;(就相當於乙個人有兩個名字。)

python程式是由**塊構造的。塊是乙個python程式的文字,他是作為乙個單元執行的。

**塊:乙個模組,乙個函式,乙個類,乙個檔案等都是乙個**塊。

**塊的快取機制:

前提條件:在同乙個**塊內

機制內容:python在執行同乙個**塊的初始化物件的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用。換句話說:執行同乙個**塊時,遇到初始化物件的命令時,他會將初始化的這個變數與值儲存在乙個字典中,在遇到新的變數時,會先在字典中查詢記錄,如果有同樣的記錄那麼它會重複使用這個字典中的之前的這個值。即:id相同。

適用物件: int(float),str,bool。
物件的具體細則:

int(float):任何數字在同一**塊下都會復用;

bool:true和false在字典中會以1,0方式存在,並且復用;

str:幾乎所有的字串都會符合快取機制;

1,非乘法得到的字串都滿足**塊的快取機制:

name="樂依慧"

print(id(name))

name1="樂依慧"

print(id(name1))

print(name is name1)

結果如下:

1718626891216

1718626891216

true

注意每次執行,id都是會變化的,但是都是指向同乙個id,id不同的原因是每次執行記憶體都會給值分配不同的id,此時值是快取在記憶體中的,而不是銷毀和重建;

2,乘法得到的字串分兩種情況:

name2="ig"*5

print(id(name2))

name3="ig"*5

print(id(name3))

print(name2 is name3)

2906504374640

2906504374640

true

用乘法得到的字串,位元組長度小於20的都滿足快取機制

3,int幾乎都滿足**塊的快取機制

a=1

print(id(a))

b=1print(id(b))

print(a is b)

得到的結果:

1521708048

1521708048

true

只是-5~256的數字在記憶體中已經快取,記憶體給這些數字分配了id,每次執行時,這些id都是固定不變的,這樣更節省記憶體,提公升效率;省去了每次記憶體執行分配id的時間;

小資料池,不同**塊的快取機制,也稱為小整數快取機制,或者稱為駐留機制等等,博主認為,只要你在網上查到的這些名字其實說的都是乙個意思,叫什麼因人而異。

前提條件:在不同乙個**塊內。

python自動將-5~256的整數進行了快取,當你將這些整數賦值給變數時,並不會重新建立物件,而是使用已經建立好的快取物件。

python會將一定規則的字串在字串駐留池中,建立乙份,當你將這些字串賦值給變數時,並不會重新建立物件, 而是使用在字串駐留池中建立好的物件。

其實,無論是快取還是字串駐留池,都是python做的乙個優化,就是將~5-256的整數,和一定規則的字串,放在乙個『池』(容器,或者字典)中,無論程式中那些變數指向這些範圍內的整數或者字串,那麼他直接在這個『池』中引用,言外之意,就是記憶體中之建立乙個。

適用物件: int(float),str,bool

物件的具體細則:

int:那麼大家都知道對於整數來說,小資料池的範圍是-5~256 ,如果多個變數都是指向同乙個(在這個範圍內的)數字,他們在記憶體中指向的都是乙個記憶體位址。

1,字串的長度為0或者1,預設都採用了駐留機制(小資料池)

2,字串的長度》1,且只含有大小寫字母,數字,下劃線時,才會預設駐留

3,用乘法得到的字串,位元組長度小於20的

4,指定駐留。

滿足以上字串的規則時,就符合小資料池的概念。

優點:能夠提高一些字串,整數處理人物在時間和空間上的效能;需要值相同的字串,整數的時候,直接從『池』裡拿來用,避免頻繁的建立和銷毀,提公升效率,節約記憶體。

如果在同一**塊下,則採用同一**塊下的快取機制。

如果是不同**塊,則採用小資料池的駐留機制。

本文大量引用和參考鏈結如下:

小資料池和編碼

1.小資料池.目的 快取我們的字串,整數,布林值.在使用的時候不需要建立過多的物件 快取 int str bool int 範圍 5 256 str 1.長度小於等於1,直接快取 2.長度大於1.字串中如果只有數字,字母,下劃線.就會快取 3.乘以1.同上,乘以大於1的數,僅包含數字,字母下劃線.最...

小資料池和編碼問題

1.小資料池 為了快 避免重複建立 1.塊 每次執行的乙個單元 函式 類 command互動命令 eval 2.is 和 記憶體位址 id 變數名 記憶體的開闢是由直譯器決定的 is比較的是記憶體位址 判斷值是否相等 我們一直在用 在python裡面,缺省會把數字 字串 bool 進行快取,這樣不需...

小資料池和編譯碼

小資料池 是一種快取機制,也被稱為駐留機制 小資料池只針對 整數,字串,布林值,其他資料型別不存在駐留機制 在python中對 5到256之間的整數會被駐留在記憶體中,將一定規則的字串快取,在使用的時候,記憶體中只會建立乙個改資料的物件,儲存在小資料池中,當使用的時候直接從小資料池中獲取物件的記憶體...