搜尋

首頁  >  問答  >  主體

如何理解python中的池化

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

PHP中文网PHP中文网2810 天前558

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-17 17:35:18

    一般來說池化是一種預先分配的機制,例如記憶體池、執行緒池等,都是為了減少在運行期間頻繁申請資源造成的開銷,但這個裡面明顯不是這個意思,起碼從上下文裡看,筆記中的池化分別指的是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)

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:35:18

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

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:35:18

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

    回覆
    0
  • 取消回覆