2017-01-10 62 views
3

此問題:Usage of __slots__?答案__slots__可以使屬性訪問速度更快。但我想知道爲什麼?爲什麼使用__slots__可以使屬性訪問更快?

當我們在一個類中定義__slots__時會發生什麼?

+1

http://stackoverflow.com/questions/14118564/how-does-slots-avoid-a-dictionary-lookup – DavidW

+0

'__slots__'是一種優化功能,它與'__dict__'字典摒棄 - 因此優化。 它有許多缺點。它必須「手動」構建和維護,而__dict__是動態的。其次,繼承類必須使用它,否則它們可能會變慢。第三,它破壞了預計會有'__dict__'的代碼。 – cdarke

回答

1

從技術文檔(slots):

默認情況下,新老風格的類的實例有一個字典屬性存儲。這浪費了具有很少實例變量的對象的空間。創建大量實例時,空間消耗可能會變得尖銳。

默認值可以通過在新樣式類定義中定義插槽來覆蓋。 插槽聲明需要一系列實例變量,並在每個實例中保留足夠的空間以保存每個變量的值。空間被保存,因爲字典不是爲每個實例創建的。

使用插槽給出內存和性能優化。

3

至於爲什麼訪問更快圭多talks about it here

特別是,爲了使數據的描述符正常工作,任何 操作對象的屬性的第一個涉及 類的檢查字典來查看該屬性是否實際上是數據描述符 。如果是這樣,則描述符被用於處理屬性 訪問,而不是像通常情況下那樣手動操縱實例字典 。但是,這種額外的檢查也意味着在檢查每個實例的字典之前將執行額外的 查找。因此,使用__slots__是優化數據屬性查找 的一種方式 - 如果您願意的話,如果您對 對新類系統的性能影響感到失望,則可以使用這種方式。

相關問題