python字符串Intern機(jī)制詳解
字符串在 Python 中是最簡(jiǎn)單也是最常用的數(shù)據(jù)類型之一,在 CPython 中字符串的實(shí)現(xiàn)原理使用了一種叫做 Intern(字符串駐留)的技術(shù)來提高字符串效率。究竟什么是 intern 機(jī)制,這種機(jī)制又是通過什么方式來提高字符串效率的呢?希望這篇文章能夠拋磚引玉。
先來看一段代碼:
>>> s3 = "hello!" >>> s4 = "hello!" >>> s3 is s4 False >>> id(s3) 80325968L >>> id(s4) 80326048L
s3 和 s4 雖然值是一樣的,但確確實(shí)實(shí)是兩個(gè)不同的字符串對(duì)象,Python 會(huì)為它們倆各自分配一段內(nèi)存空間,假設(shè)程序中存在大量值相同的字符串,系統(tǒng)就不得不為每個(gè)字符串重復(fù)地分配內(nèi)存空間,顯然,對(duì)系統(tǒng)來說是一種無謂的資源浪費(fèi)。為了解決這種問題,Python 引入了 intern 機(jī)制。
再來看:
>>> s3 = intern('hello!') >>> s4 = intern('hello!') >>> s3 is s4 True >>> id(s3) 80325968L >>> id(s4) 80325968L
intern 是 Python 中的一個(gè)內(nèi)建函數(shù),該函數(shù)的作用就是對(duì)字符串進(jìn)行 intern 機(jī)制處理,處理后返回字符串對(duì)象。我們發(fā)現(xiàn)但凡是值相同的字符串經(jīng)過 intern 機(jī)制處理之后,返回的都是同一個(gè)字符串對(duì)象,這種方式在處理大數(shù)據(jù)的時(shí)候無疑能節(jié)省更多的內(nèi)存空間,系統(tǒng)無需為相同的字符串重復(fù)分配內(nèi)存,對(duì)于值相同的字符串共用一個(gè)對(duì)象即可。
其實(shí),實(shí)現(xiàn) Intern 機(jī)制的方式非常簡(jiǎn)單,就是通過維護(hù)一個(gè)字符串儲(chǔ)蓄池,這個(gè)池子是一個(gè)字典結(jié)構(gòu),如果字符串已經(jīng)存在于池子中了就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對(duì)象,如果之前還沒有加入到該池子中,則先構(gòu)造一個(gè)字符串對(duì)象,并把這個(gè)對(duì)象加入到池子中去,方便下一次獲取,用偽代碼就可以描述為:
intern_pool = {} def intern(s): if s in intern_pool: return intern_pool[s] else: obj = PyStringObject(s) intern_pool[s] = obj return obj
在主流面向?qū)ο蟮木幊陶Z言中intern 機(jī)制對(duì)于處理字符串已經(jīng)成為一種標(biāo)配,通過 intern 機(jī)制可以提高字符串的處理效率,當(dāng)然,解釋器內(nèi)部很對(duì) intern 機(jī)制的使用策略是有考究的,有些場(chǎng)景會(huì)自動(dòng)使用 intern ,有些地方需要通過手動(dòng)方式才能啟動(dòng)。比如:
>>> s1 = "hello" >>> s2 = "hello" >>> s1 is s2 True >>> id(s1) 72320704L >>> id(s2) 72320704L
這段代碼就是 Python自動(dòng)使用了intern機(jī)制的結(jié)果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)可獲取網(wǎng)易頁面所有文本信息的網(wǎng)易網(wǎng)絡(luò)爬蟲功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)可獲取網(wǎng)易頁面所有文本信息的網(wǎng)易網(wǎng)絡(luò)爬蟲功能,涉及Python針對(duì)網(wǎng)頁的獲取、字符串正則判定等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01python?包實(shí)現(xiàn)JSON?輕量數(shù)據(jù)操作
這篇文章主要介紹了python?包實(shí)現(xiàn)JSON?輕量數(shù)據(jù)操作,文章介紹內(nèi)容首先將對(duì)象轉(zhuǎn)為json字符串展開主題詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-04-04Python編程使用PyQt5制作動(dòng)態(tài)鐘表示例
本篇文章將用 Python 同時(shí)繪制兩種類型的表;一個(gè)是上面提到的含有時(shí)、分、秒針的鐘表(為了方便,下面統(tǒng)稱為老式鐘表),一個(gè)是電子表,最終運(yùn)行效果文中如下呈現(xiàn)2021-10-10人工神經(jīng)網(wǎng)絡(luò)算法知識(shí)點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家分享了人工神經(jīng)網(wǎng)絡(luò)算法的相關(guān)知識(shí)點(diǎn)以及原理介紹,需要的朋友們參考下。2019-06-06Python數(shù)據(jù)可視化Pyecharts庫實(shí)現(xiàn)桑葚圖效果
這篇文章主要介紹了Python數(shù)據(jù)可視化如何使用Pyecharts庫來實(shí)現(xiàn)桑葚圖效果圖,文中給出實(shí)現(xiàn)的示例代碼,有需要的朋友可以借鑒參考想,希望能夠有所幫助2021-09-09python將二維數(shù)組升為一維數(shù)組或二維降為一維方法實(shí)例
在實(shí)際應(yīng)用的過程中,遇到列表或是數(shù)組的維數(shù)不同,需要變換的問題,如二維列表/數(shù)組變成了一維列表/數(shù)組,下面這篇文章主要給大家介紹了關(guān)于python將二維數(shù)組升為一維數(shù)組或二維降為一維的相關(guān)資料,需要的朋友可以參考下2022-11-11利用Hyperic調(diào)用Python實(shí)現(xiàn)進(jìn)程守護(hù)
這篇文章主要為大家詳細(xì)介紹了利用Hyperic調(diào)用Python實(shí)現(xiàn)進(jìn)程守護(hù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01