官术网_书友最值得收藏!

2.1.1 字符串對(duì)象的intern機(jī)制

在Python中,字符串是最簡(jiǎn)單也是最常用的數(shù)據(jù)類型之一。在CPython中,字符串的實(shí)現(xiàn)使用了一種叫作intern(字符串駐留)的技術(shù)來(lái)提高字符串效率,源碼示例如下:


>>> s3 = "hello!"
>>> s4 = "hello!"
>>> s3 is s4
False
>>> id(s3)
4404580528
>>> id(s4)
4404130288

源碼示例中,雖然s3和s4值是一樣的,但它們確確實(shí)實(shí)是兩個(gè)不同的字符串對(duì)象,Python會(huì)為它們各自分配一段內(nèi)存空間,如圖2-1所示。

圖2-1 字符串內(nèi)存占用示例

假設(shè)程序中存在大量值相同的字符串,系統(tǒng)就不得不為每個(gè)字符串重復(fù)地分配內(nèi)存空間,這對(duì)系統(tǒng)來(lái)說(shuō)是一種資源浪費(fèi)。為了解決這種問(wèn)題,Python引入了intern()函數(shù),源碼示例如下:


>>> import sys
>>> s3 = sys.intern('hello!')
>>> s4 = sys.intern('hello!')
>>> s3 is s4
True
>>> id(s3)
4472499504
>>> id(s4)
4472499504

上述示例中,s3和s4經(jīng)intern()函數(shù)處理后,對(duì)象指向如圖2-2所示。

圖2-2 intern()函數(shù)處理示例

intern()是Python中sys模塊中的一個(gè)函數(shù),該函數(shù)的作用是對(duì)字符串進(jìn)行處理,處理后返回字符串對(duì)象。

凡是值相同的字符串經(jīng)過(guò)intern()函數(shù)處理之后,返回的都是同一個(gè)字符串對(duì)象,這種方式在處理大量數(shù)據(jù)的時(shí)候無(wú)疑能節(jié)省更多的內(nèi)存空間。系統(tǒng)無(wú)須為相同的字符串重復(fù)分配內(nèi)存,而是值相同的字符串共用一個(gè)對(duì)象即可。

實(shí)現(xiàn)intern()函數(shù)非常簡(jiǎn)單,就是通過(guò)維護(hù)一個(gè)字符串儲(chǔ)蓄池,這個(gè)池子是一個(gè)字典結(jié)構(gòu)。如果字符串已經(jīng)存在于字符串儲(chǔ)蓄池,系統(tǒng)就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對(duì)象;如果字符串還沒(méi)有加入字符串儲(chǔ)蓄池,系統(tǒng)則先構(gòu)造一個(gè)字符串對(duì)象,并把這個(gè)對(duì)象加入字符串儲(chǔ)蓄池,便于下次獲取。

在面向?qū)ο蟮闹髁骶幊陶Z(yǔ)言中,intern()函數(shù)對(duì)于處理字符串已經(jīng)成為一種標(biāo)配,可以提高字符串的處理效率。

主站蜘蛛池模板: 郎溪县| 潮州市| 肃北| 新晃| 城口县| 江源县| 长沙市| 乌什县| 时尚| 沙坪坝区| 金坛市| 景洪市| 犍为县| 石嘴山市| 东乡族自治县| 德格县| 台州市| 固镇县| 宝山区| 荥阳市| 奈曼旗| 山东省| 莱州市| 旬邑县| 抚州市| 嵊泗县| 西盟| 且末县| 商丘市| 宜宾县| 宕昌县| 津南区| 四子王旗| 图片| 浦城县| 阳信县| 驻马店市| 乐业县| 固阳县| 阳江市| 临武县|