摘要:我們之前提到過(guò),基于的服務(wù)器緩存了大量字典哈希表的靜態(tài)內(nèi)容。好啦,我們最近使用一行代碼在我們的類中使用,使得每個(gè)的服務(wù)器在處理中都節(jié)省超過(guò)內(nèi)存。一般說(shuō)來(lái),這很不錯(cuò),而且還支持完全動(dòng)態(tài)性,比如在運(yùn)行時(shí)設(shè)置任意新的屬性。
我們之前提到過(guò),Oyster.com基于Python的web服務(wù)器緩存了大量Python字典(dicts)(哈希表(hash tables))的靜態(tài)內(nèi)容。好啦,我們最近使用一行代碼——在我們的Image類中使用__slots__,使得每個(gè)6GB的服務(wù)器在處理中都節(jié)省超過(guò)2GB內(nèi)存。
這是使用前和使用這一改變后再部署的RAM用量截圖:
我們大概分配了一百萬(wàn)個(gè)下面這個(gè)類的實(shí)例:
pythonclass Image(object): def __init__(self, id, caption, url): self.id = id self.caption = caption self.url = url self._setup() # ... other methods ...
Python默認(rèn)使用一個(gè)字典來(lái)存儲(chǔ)一個(gè)對(duì)象的實(shí)例屬性。一般說(shuō)來(lái),這很不錯(cuò),而且還支持完全動(dòng)態(tài)性,比如在運(yùn)行時(shí)設(shè)置任意新的屬性。
然而,對(duì)于一個(gè)“小類”來(lái)說(shuō),有一些在“編譯時(shí)”就已經(jīng)固定的屬性,這樣一來(lái),字典實(shí)際上是在消耗內(nèi)存,在創(chuàng)建一百萬(wàn)個(gè)這樣的類的時(shí)候,消耗更是顯而易見(jiàn)。你可以跟Python說(shuō)不使用字典,而是僅為某些固定的屬性分配空間,可以通過(guò)在類中將__slots__設(shè)置為一個(gè)固定列表來(lái)實(shí)現(xiàn)這個(gè)效果:
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 ...
需要特別說(shuō)到的是,你也可以使用 collections.namedtuple,它僅限定元組空間(the space of a tuple)中的屬性能夠訪問(wèn),這與在類中使用__slots__相似。但是,在我看來(lái),從一個(gè)命名元組(namedtuple)類中繼承令人感到怪異。并且,如果你想自定義初始化器(initializer),你還必須重寫__new__而不是用__init__。
警告:別過(guò)早優(yōu)化或者將此應(yīng)用在所有場(chǎng)景!這個(gè)方法并不利于代碼維護(hù),而且在你真的有成千個(gè)實(shí)例的時(shí)候才有顯著效果。
來(lái)自:Saving 9 GB of RAM with Python’s __slots__
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/45329.html
摘要:自定義向量類型從自定義向量類型入手寫出符合風(fēng)格的對(duì)象,這離不開特殊方法的支持。將對(duì)象定為不可變的通過(guò)使用兩個(gè)前導(dǎo)下劃線。程序員約定使用一個(gè)下劃線前綴編寫受保護(hù)的屬性即,他們認(rèn)為應(yīng)該使用命名約定來(lái)避免意外覆蓋屬性。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握編寫Pythonic c...
摘要:概述如果程序處理的數(shù)據(jù)比較多比較復(fù)雜,那么在程序運(yùn)行的時(shí)候,會(huì)占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用的內(nèi)存大小的場(chǎng)景,更容易發(fā)生問(wèn)題。下面我就給出幾個(gè)優(yōu)化占用內(nèi)存的幾個(gè)方法。 概述 如果程序處理的數(shù)據(jù)比較多、比較復(fù)雜,那么在程序運(yùn)行的時(shí)候,會(huì)占用大量的內(nèi)存,當(dāng)內(nèi)存占用到達(dá)一定的數(shù)值,程序就有可能被操作系統(tǒng)終止,特別是在限制程序所使用...
摘要:本篇繼續(xù)學(xué)習(xí)之路,實(shí)現(xiàn)更多的特殊方法以讓自定義類的行為跟真正的對(duì)象一樣。之所以要讓向量不可變,是因?yàn)槲覀冊(cè)谟?jì)算向量的哈希值時(shí)需要用到和的哈希值,如果這兩個(gè)值可變,那向量的哈希值就能隨時(shí)變化,這將不是一個(gè)可散列的對(duì)象。 《流暢的Python》筆記。本篇是面向?qū)ο髴T用方法的第二篇。前一篇講的是內(nèi)置對(duì)象的結(jié)構(gòu)和行為,本篇?jiǎng)t是自定義對(duì)象。本篇繼續(xù)Python學(xué)習(xí)之路20,實(shí)現(xiàn)更多的特殊方法以讓...
摘要:什么是中的它的用途是什么裝飾器對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要參數(shù),但第一個(gè)參數(shù)需要是表示自身類的參數(shù),可以來(lái)調(diào)用類的屬性,類的方法,實(shí)例化對(duì)象等。 什么是python中的classmethod,它的用途是什么? classmethod裝飾器對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要 self 參數(shù),但第一個(gè)參數(shù)需要是表示自身類的 cls 參數(shù),可以來(lái)調(diào)用類的屬性,類的方法,實(shí)例化對(duì)象等。 cl...
摘要:以便于用戶理解的方式返回對(duì)象的字符串表示形式。函數(shù)會(huì)調(diào)用函數(shù),對(duì)來(lái)說(shuō),輸出的是一個(gè)有序?qū)Α4送?,還有用于支持內(nèi)置的構(gòu)造函數(shù)的方法??缮⒘袑?shí)現(xiàn)了方法,使用推薦的異或運(yùn)算符計(jì)算實(shí)例屬性的散列值私有屬性最好用命名規(guī)則來(lái)實(shí)現(xiàn)這種方式有好有壞 絕對(duì)不要使用兩個(gè)前導(dǎo)下劃線,這是很煩人的自私行為。——Ian Bicking 對(duì)象表示形式 repr() 以便于開發(fā)者理解的方式返回對(duì)象的字符串表示形式...
閱讀 3718·2021-10-09 09:58
閱讀 1275·2021-09-22 15:20
閱讀 2558·2019-08-30 15:54
閱讀 3570·2019-08-30 14:08
閱讀 955·2019-08-30 13:06
閱讀 1885·2019-08-26 12:16
閱讀 2745·2019-08-26 12:11
閱讀 2574·2019-08-26 10:38