成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

通過Python的__slots__節(jié)省9GB內(nèi)存

EastWoodYang / 973人閱讀

摘要:我們之前提到過,基于的服務(wù)器緩存了大量字典哈希表的靜態(tài)內(nèi)容。好啦,我們最近使用一行代碼在我們的類中使用,使得每個的服務(wù)器在處理中都節(jié)省超過內(nèi)存。一般說來,這很不錯,而且還支持完全動態(tài)性,比如在運行時設(shè)置任意新的屬性。

我們之前提到過,Oyster.com基于Python的web服務(wù)器緩存了大量Python字典(dicts)(哈希表(hash tables))的靜態(tài)內(nèi)容。好啦,我們最近使用一行代碼——在我們的Image類中使用__slots__,使得每個6GB的服務(wù)器在處理中都節(jié)省超過2GB內(nèi)存。

這是使用前和使用這一改變后再部署的RAM用量截圖:

我們大概分配了一百萬個下面這個類的實例:

pythonclass Image(object):
    def __init__(self, id, caption, url):
        self.id = id
        self.caption = caption
        self.url = url
        self._setup()

    # ... other methods ...

Python默認使用一個字典來存儲一個對象的實例屬性。一般說來,這很不錯,而且還支持完全動態(tài)性,比如在運行時設(shè)置任意新的屬性。

然而,對于一個“小類”來說,有一些在“編譯時”就已經(jīng)固定的屬性,這樣一來,字典實際上是在消耗內(nèi)存,在創(chuàng)建一百萬個這樣的類的時候,消耗更是顯而易見。你可以跟Python說不使用字典,而是僅為某些固定的屬性分配空間,可以通過在類中將__slots__設(shè)置為一個固定列表來實現(xiàn)這個效果:

pythonclass 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,它僅限定元組空間(the space of a tuple)中的屬性能夠訪問,這與在類中使用__slots__相似。但是,在我看來,從一個命名元組(namedtuple)類中繼承令人感到怪異。并且,如果你想自定義初始化器(initializer),你還必須重寫__new__而不是用__init__。

警告:別過早優(yōu)化或者將此應(yīng)用在所有場景!這個方法并不利于代碼維護,而且在你真的有成千個實例的時候才有顯著效果。

來自:Saving 9 GB of RAM with Python’s __slots__

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45329.html

相關(guān)文章

  • 編寫符合Python風(fēng)格對象

    摘要:自定義向量類型從自定義向量類型入手寫出符合風(fēng)格的對象,這離不開特殊方法的支持。將對象定為不可變的通過使用兩個前導(dǎo)下劃線。程序員約定使用一個下劃線前綴編寫受保護的屬性即,他們認為應(yīng)該使用命名約定來避免意外覆蓋屬性。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點: 1、掌握編寫Pythonic c...

    ethernet 評論0 收藏0
  • 如何優(yōu)化Python占用內(nèi)存

    摘要:概述如果程序處理的數(shù)據(jù)比較多比較復(fù)雜,那么在程序運行的時候,會占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用的內(nèi)存大小的場景,更容易發(fā)生問題。下面我就給出幾個優(yōu)化占用內(nèi)存的幾個方法。 概述 如果程序處理的數(shù)據(jù)比較多、比較復(fù)雜,那么在程序運行的時候,會占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用...

    ThreeWords 評論0 收藏0
  • Python學(xué)習(xí)之路28-符合Python風(fēng)格對象

    摘要:本篇繼續(xù)學(xué)習(xí)之路,實現(xiàn)更多的特殊方法以讓自定義類的行為跟真正的對象一樣。之所以要讓向量不可變,是因為我們在計算向量的哈希值時需要用到和的哈希值,如果這兩個值可變,那向量的哈希值就能隨時變化,這將不是一個可散列的對象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對象的結(jié)構(gòu)和行為,本篇則是自定義對象。本篇繼續(xù)Python學(xué)習(xí)之路20,實現(xiàn)更多的特殊方法以讓...

    Eric 評論0 收藏0
  • classmethod&staticmethod 以及 __slots__

    摘要:什么是中的它的用途是什么裝飾器對應(yīng)的函數(shù)不需要實例化,不需要參數(shù),但第一個參數(shù)需要是表示自身類的參數(shù),可以來調(diào)用類的屬性,類的方法,實例化對象等。 什么是python中的classmethod,它的用途是什么? classmethod裝飾器對應(yīng)的函數(shù)不需要實例化,不需要 self 參數(shù),但第一個參數(shù)需要是表示自身類的 cls 參數(shù),可以來調(diào)用類的屬性,類的方法,實例化對象等。 cl...

    newsning 評論0 收藏0
  • 流暢python讀書筆記-第九章-符合Python風(fēng)格對象

    摘要:以便于用戶理解的方式返回對象的字符串表示形式。函數(shù)會調(diào)用函數(shù),對來說,輸出的是一個有序?qū)Α4送?,還有用于支持內(nèi)置的構(gòu)造函數(shù)的方法??缮⒘袑崿F(xiàn)了方法,使用推薦的異或運算符計算實例屬性的散列值私有屬性最好用命名規(guī)則來實現(xiàn)這種方式有好有壞 絕對不要使用兩個前導(dǎo)下劃線,這是很煩人的自私行為。——Ian Bicking 對象表示形式 repr()  以便于開發(fā)者理解的方式返回對象的字符串表示形式...

    fai1017 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<