天天看點

用Python的 __slots__ 節省9G記憶體

這是其中一個伺服器在部署代碼前後的截圖:

用Python的 __slots__ 節省9G記憶體

physical-memory-usage-history

我們alloc了大約一百萬個類似如下class的執行個體:

預設情況下,python用一個dict來存儲對象執行個體的屬性。這在一般情況下還不錯,而且非常靈活,乃至你在運作時可以随意設定新的屬性。

但是,對一些在”編譯”前就知道該有幾個固定屬性的小class來說,這個dict就有點浪費記憶體了。而當你把這個小浪費乘上一百萬,那可就大不同了。在python中,你可以在class中設定__slots__,它是一個包含這些固定的屬性名的list。這樣python就不會再使用dict,而且隻配置設定這些屬性的空間。

你還可以用collections.namedtuple,它允許通路參數,但隻占用一個tuple的空間。這跟__slots__類似。不過我總覺得繼承一個namedtuple類很奇怪。另外,如果你需要自定義初始化,你應該重載__new__而不是__init__。

警告:不要貿然進行這個優化,把它用在所有地方。這種做法不利于代碼維護,而且隻有當你有數以千計的執行個體的時候才會有明顯效果。

原文釋出時間為:2013-12-03

本文來自雲栖社群合作夥伴“linux中國”