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

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中國”