1. 程式人生 > >python基礎===創建大量對象是節省內存方法

python基礎===創建大量對象是節省內存方法

nbsp 優化 pre 實現 self 化工 microsoft 總量 spa

問題:

  你的程序要創建大量(可能上百萬) 的對象,導致占用很大的內存。

解決方案:
  對於主要是用來當成簡單的數據結構的類而言,你可以通過給類添加__slots__屬性來極大的減少實例所占的內存比如:

class Date:
    __slots__ = [year, month, day]
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

  

  當你定義__slots__ 後,Python 就會為實例使用一種更加緊湊的內部表示。實例通過一個很小的固定大小的數組來構建,而不是為每個實例定義一個字典,這跟元組或列表很類似。在__slots__ 中列出的屬性名在內部被映射到這個數組的指定小標上。使用slots 一個不好的地方就是我們不能再給實例添加新的屬性了,只能使用在__slots__ 中定義的那些屬性名。

  使用slots 後節省的內存會跟存儲屬性的數量和類型有關。不過,一般來講,使用到的內存總量和將數據存儲在一個元組中差不多。為了給你一個直觀認識,假設你不使用slots 直接存儲一個Date 實例,在64 位的Python 上面要占用428 字節,而如果使用了slots,內存占用下降到156 字節。如果程序中需要同時創建大量的日期實例,那麽這個就能極大的減小內存使用量了。
  

  盡管slots 看上去是一個很有用的特性,很多時候你還是得減少對它的使用沖動。Python 的很多特性都依賴於普通的基於字典的實現。另外,定義了slots 後的類不再支持一些普通類特性了,比如多繼承。大多數情況下,你應該只在那些經常被使用到的用作數據結構的類上定義slots (比如在程序中需要創建某個類的幾百萬個實例對象)。


  關於__slots__ 的一個常見誤區是它可以作為一個封裝工具來防止用戶給實例增加新的屬性。盡管使用slots 可以達到這樣的目的,但是這個並不是它的初衷。__slots__更多的是用來作為一個內存優化工具。

python基礎===創建大量對象是節省內存方法