W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你的程序要?jiǎng)?chuàng)建大量(可能上百萬)的對象,導(dǎo)致占用很大的內(nèi)存。
對于主要是用來當(dāng)成簡單的數(shù)據(jù)結(jié)構(gòu)的類而言,你可以通過給類添加 __slots__
屬性來極大的減少實(shí)例所占的內(nèi)存。比如:
class Date:
__slots__ = ['year', 'month', 'day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
當(dāng)你定義 __slots__
后,Python就會為實(shí)例使用一種更加緊湊的內(nèi)部表示。實(shí)例通過一個(gè)很小的固定大小的數(shù)組來構(gòu)建,而不是為每個(gè)實(shí)例定義一個(gè)字典,這跟元組或列表很類似。在 __slots__
中列出的屬性名在內(nèi)部被映射到這個(gè)數(shù)組的指定小標(biāo)上。使用slots一個(gè)不好的地方就是我們不能再給實(shí)例添加新的屬性了,只能使用在 __slots__
中定義的那些屬性名。
使用slots后節(jié)省的內(nèi)存會跟存儲屬性的數(shù)量和類型有關(guān)。不過,一般來講,使用到的內(nèi)存總量和將數(shù)據(jù)存儲在一個(gè)元組中差不多。為了給你一個(gè)直觀認(rèn)識,假設(shè)你不使用slots直接存儲一個(gè)Date實(shí)例,在64位的Python上面要占用428字節(jié),而如果使用了slots,內(nèi)存占用下降到156字節(jié)。如果程序中需要同時(shí)創(chuàng)建大量的日期實(shí)例,那么這個(gè)就能極大的減小內(nèi)存使用量了。
盡管slots看上去是一個(gè)很有用的特性,很多時(shí)候你還是得減少對它的使用沖動。Python的很多特性都依賴于普通的基于字典的實(shí)現(xiàn)。另外,定義了slots后的類不再支持一些普通類特性了,比如多繼承。大多數(shù)情況下,你應(yīng)該只在那些經(jīng)常被使用到的用作數(shù)據(jù)結(jié)構(gòu)的類上定義slots(比如在程序中需要?jiǎng)?chuàng)建某個(gè)類的幾百萬個(gè)實(shí)例對象)。
關(guān)于 __slots__
的一個(gè)常見誤區(qū)是它可以作為一個(gè)封裝工具來防止用戶給實(shí)例增加新的屬性。盡管使用slots可以達(dá)到這樣的目的,但是這個(gè)并不是它的初衷。__slots__
更多的是用來作為一個(gè)內(nèi)存優(yōu)化工具。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: