此文章作者使用python的__slots__節(jié)省了將近9G的內(nèi)存
原文鏈接: http://tech.oyster.com/save-ram-with-python-slots/
我們前面提到過Oyster.com的Python Web服務(wù)器是使用Python Dict存儲大量的靜態(tài)內(nèi)容的包斑。最近誉察,我們使用Python的__slots__在4個處理器中每個處理器節(jié)省了2G的內(nèi)存空間单刁。
下面是一張我們使用這個方法前后的內(nèi)存快照:
我們差不多創(chuàng)建了上百萬個Image類的實例:
class Image(object):
__slots__ = ['id', 'caption', 'url']
def __init__(self, id, caption, url):
self.id = id
self.caption = caption
self.url = url
self._setup()
# ... other methods ...
通常情況下Python使用dict來存儲實例,這樣非常好叫胖,它允許在運行時對實例設(shè)置變量。
然而,對一些在編譯期就已經(jīng)知道有什么變量的類挟阻,dict是非常耗內(nèi)存的店读,當(dāng)創(chuàng)建上百萬個實例的時候嗦枢,不足就更加突出了。你可以使用__slots__告知Python不用dict屯断,只分配固定的空間來存儲已知的屬性
class Image(object):
__slots__ = ['id', 'caption', 'url']
def __init__(self, id, caption, url):
self.id = id
self.caption = caption
self.url = url
self._setup()
# ... other methods ...
需要注意的是文虏,你也可以使用collections.namedtuple來實現(xiàn)上面的結(jié)果,然而對我來說這種方式總是感覺奇怪殖演,如果你想定制初始化氧秘,你需要重載__new__,而不是__init__趴久。
注意:不用過早的優(yōu)化和使用這個方法丸相,它不利于代碼維護,當(dāng)實例很多(上千萬)時彼棍,這種優(yōu)化才有明顯的效果已添。