python基礎---小整數對象池與字符串的intern機制

一、整數:

Python裏一切都是對象.所以1,2,3,4…這些整數也都是對象。這些基本的不可變對象在python裏會被頻繁的引用,創建,如果不找到好的辦法的話很容易讓python引發效率瓶頸,所以python引入了整數對象池的機制(參考intobject.c中代碼片段)
代碼段中,清楚寫了[-5, 256) 這些小整數被定義在了這個對象池裏.所以當引用小整數時會自動引用整數對象池裏的對象

二、字符串

字符串對象也是不可變對象,python有個intern機制,簡單說就是維護一個字典,這個字典維護已經創建字符串(key)和它的字符串對象的地址(value),每次創建字符串對象都會和這個字典比較,沒有就創建,重複了就用指針進行引用就可以了。

三、其它類型

float類型可以認爲每個賦值都是創建一個對象,因爲float有點多,所以沒必要和int一樣了.
tuple它是不可變對象,理應和int和string一樣會做一個緩存,但是,tuple的數據結構很簡單,簡單到不能再簡單,就是一個數組,裏面是元組的迭代對象,這個對象指向的是各個元素.最關鍵的是元組沒有實現intern機制

四、原因:空間效率和時間效率的妥協

相比於數字,string本身參與的運算要少很多,而且string本身佔據的空間也大許多,因此string的主要問題在於不共享帶來的空間浪費,所以string實現了很費時間的intern操作。
對於數字情況正好相反。作爲一個數字,需要做的運算要比string多太多了,而且大小比string也小很多。如果在計算10000+20000之前先花好久查找重複對象,導致一個1ms完成的加法花了100ms。

參考:Python源碼剖析

發佈了40 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章