国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

8.4 創(chuàng)建大量對象時(shí)節(jié)省內(nèi)存方法

2018-02-24 15:26 更新

問題

你的程序要?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)化工具。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號