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