《python源碼剖析》閱讀筆記

第一章 python的內(nèi)建對(duì)象

python中一切都是對(duì)象鹿鳖。在PyIntObject中定義了很多函數(shù)指針通铲,這些函數(shù)指針對(duì)應(yīng)著類型對(duì)象所定義的操作官辈。其中有三組非常重要的操作族援岩,tp_as_number, tp_as_sequence, tp_as_mapping,分別對(duì)應(yīng)著PyNumberMethods, PySequenceMethods, PyMappingMethods函數(shù)族锹锰,這三個(gè)函數(shù)都是分別定義著一個(gè)整數(shù)對(duì)象芥炭、序列對(duì)象、關(guān)聯(lián)對(duì)象應(yīng)該有的一些操作恃慧。在python中對(duì)于任何一種類型來(lái)說(shuō)园蝠,都可以同時(shí)定義三個(gè)函數(shù)族中的所有操作,也就是說(shuō)痢士,我們可以在繼承python固有的類型時(shí)彪薛,又同時(shí)重寫python的special method,從而實(shí)現(xiàn)我們自己定義的特殊類型怠蹂。比如可以實(shí)現(xiàn)一個(gè)對(duì)象善延,既可以表現(xiàn)出數(shù)值特性,也可以表現(xiàn)出關(guān)聯(lián)對(duì)象的屬性城侧。

第二章 python中的整數(shù)對(duì)象

python的整數(shù)對(duì)象易遣。在python中會(huì)有一個(gè)整數(shù)對(duì)象池,里面維護(hù)著-5到256之間的整數(shù)嫌佑,當(dāng)我們需要使用這些范圍的數(shù)字時(shí)豆茫,直接到對(duì)象池中去提取侨歉。這樣設(shè)計(jì)是因?yàn)樵趯?shí)際的開發(fā)中,這些小數(shù)可能會(huì)被頻繁的使用澜薄,頻繁的創(chuàng)建和湮滅會(huì)導(dǎo)致效率非常低为肮。對(duì)于超出這些范圍的數(shù)字,python底層則是通過單獨(dú)申請(qǐng)一塊內(nèi)存塊來(lái)給這些大整數(shù)輪流使用肤京,當(dāng)某個(gè)對(duì)象的引用次數(shù)為零的時(shí)候,會(huì)把該對(duì)象所占用的這塊內(nèi)存添加到空閑區(qū)(注意茅特,這里python并沒有將釋放的內(nèi)存還給系統(tǒng)忘分,所以當(dāng)出現(xiàn)很多大數(shù)要被使用的時(shí)候,而這些數(shù)又是使用一次白修,可能就會(huì)占用系統(tǒng)的所有內(nèi)存妒峦。)

第三章 python中的字符串對(duì)象

  1. 在python中,PyStringObject是字符串對(duì)象的實(shí)現(xiàn)兵睛,它是一個(gè)可變長(zhǎng)度內(nèi)存的對(duì)象肯骇,同時(shí)又是一個(gè)不可變對(duì)象(字符串定義之后不可再改變)。python字符串對(duì)象中的intern機(jī)制祖很,類似于前面的python整數(shù)對(duì)象池笛丙。其關(guān)鍵是在于在系統(tǒng)中有一個(gè)(key, value)的映射關(guān)系集合,集合名字叫做Intered假颇。在這個(gè)集合中記錄過被intern機(jī)制處理過的字符串胚鸯。當(dāng)python在創(chuàng)建一個(gè)字符串時(shí),首先會(huì)建立一個(gè)PyStringObject對(duì)象a笨鸡,然后利用intern機(jī)制處理姜钳,如果當(dāng)前這個(gè)字符串對(duì)象已經(jīng)在interned中存在,記為b形耗,則將指向a的對(duì)象的指針指向b哥桥,然后intern機(jī)制會(huì)將對(duì)象a的引用計(jì)數(shù)減為0而被銷毀。這樣的話激涤,可以達(dá)到減少內(nèi)存的目的拟糕。
    也許會(huì)有一個(gè)問題,為什么一定要先創(chuàng)建一個(gè)臨時(shí)PyStringObject對(duì)象呢昔期?
    這是因?yàn)閕ntern機(jī)制只能應(yīng)用在PyStringObject對(duì)象之上已卸,別的任何對(duì)象都不可以。因此這里必須要先創(chuàng)建一個(gè)臨時(shí)對(duì)象硼一。
  2. python中也為一個(gè)字節(jié)的字符設(shè)計(jì)了字符緩沖池累澡,與小整數(shù)對(duì)象池不一樣的是,小整數(shù)對(duì)象池在python初始化的時(shí)候就會(huì)被創(chuàng)建般贼,而字符串對(duì)象中的字符緩沖池是以靜態(tài)變量形式存在的愧哟,在python初始化完成之后奥吩,字符緩沖池是空的。當(dāng)python在創(chuàng)建一個(gè)PyStringObject的時(shí)候蕊梧,如果字符串長(zhǎng)度為1(即單個(gè)字符串)霞赫,則將會(huì)對(duì)這個(gè)字符進(jìn)行intern操作,將intern的這個(gè)結(jié)果緩存到字符緩沖池中肥矢。當(dāng)通過PyString_FromStringandSize(const char *str, int size)來(lái)創(chuàng)建字符對(duì)象時(shí)端衰,如果size等于1,并且在字符緩沖池中存在甘改,則直接返回旅东。
  3. python中字符串的連接效率問題。當(dāng)我們采用+號(hào)來(lái)連接多個(gè)字符串時(shí)十艾,效率是非常低的抵代。其根源在于,python中的字符串對(duì)象是一個(gè)不可變對(duì)象忘嫉,因此在連接兩個(gè)字符串的時(shí)候荤牍,則要去新建一個(gè)PyStringObject對(duì)象,當(dāng)我們用‘+’來(lái)連接N個(gè)字符串時(shí)庆冕,實(shí)際上會(huì)進(jìn)行N-1次內(nèi)存申請(qǐng)和內(nèi)存搬運(yùn)康吵,因而效率很低。解決方案是愧杯,我們采用字符串對(duì)象的join操作來(lái)實(shí)現(xiàn)多個(gè)字符串的連接涎才,當(dāng)使用join操作的時(shí)候,會(huì)一次性計(jì)算好需要的總的內(nèi)存力九,也就是只需要執(zhí)行一次內(nèi)存申請(qǐng)耍铜,因此效率會(huì)比用‘+’號(hào)連接的效率更高
strs_list = ['hello', 'fay', 'welcome', 'to', 'python ']
' '.join(strs_list)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跌前,隨后出現(xiàn)的幾起案子棕兼,更是在濱河造成了極大的恐慌,老刑警劉巖抵乓,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伴挚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡灾炭,警方通過查閱死者的電腦和手機(jī)茎芋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜈出,“玉大人田弥,你說(shuō)我怎么就攤上這事≌≡” “怎么了偷厦?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵商叹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我只泼,道長(zhǎng)剖笙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上咖城,老公的妹妹穿的比我還像新娘。我一直安慰自己酪夷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布孽惰。 她就那樣靜靜地躺著,像睡著了一般鸥印。 火紅的嫁衣襯著肌膚如雪勋功。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天库说,我揣著相機(jī)與錄音狂鞋,去河邊找鬼。 笑死潜的,一個(gè)胖子當(dāng)著我的面吹牛骚揍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啰挪,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼信不,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了亡呵?” 一聲冷哼從身側(cè)響起抽活,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锰什,沒想到半個(gè)月后下硕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汁胆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年梭姓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫩码。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誉尖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谢谦,到底是詐尸還是另有隱情释牺,我是刑警寧澤萝衩,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站没咙,受9級(jí)特大地震影響猩谊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭刚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一牌捷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涡驮,春花似錦暗甥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至棒口,卻和暖如春寄月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背无牵。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工漾肮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茎毁。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓克懊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親七蜘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谭溉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,583評(píng)論 1 118
  • Python源碼剖析筆記4-內(nèi)建數(shù)據(jù)類型 Python內(nèi)建數(shù)據(jù)類型包括整數(shù)對(duì)象PyIntObject,字符串對(duì)象P...
    __七把刀__閱讀 1,139評(píng)論 0 2
  • 一崔梗、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,750評(píng)論 0 10
  • 1. 簡(jiǎn)單的例子 先從一個(gè)簡(jiǎn)單的例子說(shuō)起夜只,包含了兩個(gè)文件 foo.py 和 demo.py 執(zhí)行這個(gè)程序pytho...
    jiangmo閱讀 1,722評(píng)論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,111評(píng)論 1 32