如何理解python中的池化
PHP中文网
PHP中文网 2017-04-17 17:33:18
0
3
533

在阅读雨痕的python学习笔记第二版中有这样一段话,并没有更多的解释,搜索之后也没有更多相关的资料。
个人感觉是对应字符串对象的一些属性进行修改或者精简,想请教一下大家XD~

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(3)
迷茫

一般來說池化是一種預先分配的機制,例如記憶體池、執行緒池等,都是為了減少在運行期間頻繁申請資源造成的開銷,但這個裡面明顯不是這個意思,起碼從上下文裡看,筆記中的池化分別指的是2個不同的意思,一個是類別的屬性,一個是常量資源的記憶體佈局。
1) __name__和__doc__這個指的應該是這些屬性屬於類別的屬性,而非實例化後的物件的屬性,例如

from PyQt4.QtCore import *

print QString.__doc__

a = QString("hello")

print a.__doc__

這裡使用QString這個類別即可索引到對應的__doc__,每個實例化後的物件也可以存取這個屬性,但明顯資料存放在類別中由所有實例化後的物件共用更節省資源。

2) 個人覺得intern這個例子舉得不太好,這個intern應該是來自java的String的一個方法(或者是當初java參考了python引入的,至於誰先誰後,無從考究),見

http://blog.sina.com.cn/s/blog_69dcd5ed0...

python裡面用id()來標記每個物件的位址信息,所以,如果2個物件的id()不一樣的話,表示在記憶體佈局上,這2個物件的記憶體位址是不一樣的(但其內容可能相同)。所以,為了使具有相同內容的物件引用的內存空間是一樣的話,使用intern關鍵字處理下,可以達到這個目的,進而節省內存,見下面例子

b = "abc"
a = "".join(["a", "b", "c"])


print a == b # 内容是一致的,b是直接引用一个字符串常量,但a是经过计算后、也就是在运行的过程中生成的
print id(a) == id(b) #但是id不一样

a = intern(a) #使用intern处理下,id一样了

print id(a) == id(b)
PHPzhong

推薦看下 Python原始碼剖析
物件池作為在Python內部被大量使用的技術,直接看原始碼的話會有更清晰的理解。

PHPzhong

簡單來說就是-128到正127範圍的int值全域唯一,不管程式讀寫多少次,這些常用物件由python解釋器維持引用,達到節省記憶體的效果,不同型別有不同的池子,字串的話一般會把常用的單字元等放在池子裡,intern就是對池子的一種操作介面。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!