程式扎記: [ Python 文章收集 ] Python內置屬性__slots__ & __dict__

標籤

2015年6月21日 星期日

[ Python 文章收集 ] Python內置屬性__slots__ & __dict__

Source From Here 
Preface 
Python 內置屬性很多,其中 __slots__ 屬性比較少會被用到,基本不會被當作是必選項。但如果您對內存使用有頗高的要求,__slots__ 會給你很大幫助: 
By default, instances of both old and new-style classes have a dictionary for attribute storage. This wastes space for objects having very few instance variables. The space consumption can become acute when creating large numbers of instances.

The default can be overridden by defining __slots__ in a new-style class definition. The __slots__ declaration takes a sequence of instance variables and reserves just enough space in each instance to hold a value for each variable. Space is saved because __dict__ is not created for each instance.

說起 __slots__ 網上大多數文章是從它的影響說起,就是限制實例的屬性定義。弄的我一開始也以為這東西就是為了這個存在的。顯然,它不是... 而 __slots__ 的目的又是什麼呢? 答案是:優化內存使用。限制實例屬性的自由添加只是副作用而已。 

Python內置屬性 __slots__ & __dict__ 
那麼 __slots__ 屬性究竟如何神奇?這要先從 __dict__ 屬性說起。 __dict__ 屬性的用途在於記錄實例屬性: 
 

上邊例子中可以清楚看到,__dict__ 屬性用來記錄實例中的屬性信息,如果對實例中的屬性信息進行修改或者添加新的屬性,__dict__ 都會對其進行記錄。 

那麼 __slots__ 跟 __dict__ 又有什麼關係呢? 


簡單點理解,__slots__ 存在的價值在於刪除 __dict__ 屬性,從而來優化類實例對內存的需求。而這帶來的副作用就是:由於缺少了 __dict__,類實例木有辦法再自由添加屬性了! 但還是那句話:如果你對內存使用優化有迫切的需求,這點犧牲算不了什麼。 

我們通過下邊跟上邊兩段代碼對比,了解 __slots__ 的工作原理和使用方法: 
 

你可能會問,這東西能節省多少內存啊!你若只有10個實例,那幾乎沒任何效果,可如果你有數以萬計實例呢?看看這片博文 SAVING 9 GB OF RAM WITH PYTHON'S SLOTS,優化出 9G 內存,原使用率的 1/3!

沒有留言:

張貼留言

網誌存檔