書名: Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼作者名: 劉宇宙 謝東 劉艷本章字?jǐn)?shù): 621字更新時(shí)間: 2021-04-30 12:39:36
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)配,可以提高字符串的處理效率。
- Flask Web全棧開(kāi)發(fā)實(shí)戰(zhàn)
- 零基礎(chǔ)搭建量化投資系統(tǒng):以Python為工具
- PHP基礎(chǔ)案例教程
- Instant Zepto.js
- 深入淺出Windows API程序設(shè)計(jì):編程基礎(chǔ)篇
- Python神經(jīng)網(wǎng)絡(luò)項(xiàng)目實(shí)戰(zhàn)
- Java持續(xù)交付
- Mastering Kali Linux for Web Penetration Testing
- Oracle Exadata專家手冊(cè)
- Webpack實(shí)戰(zhàn):入門、進(jìn)階與調(diào)優(yōu)
- 0 bug:C/C++商用工程之道
- BeagleBone Robotic Projects(Second Edition)
- MySQL 8從零開(kāi)始學(xué)(視頻教學(xué)版)
- Qt 4開(kāi)發(fā)實(shí)踐
- 大學(xué)計(jì)算機(jī)應(yīng)用基礎(chǔ)(Windows 7+Office 2010)(IC3)