類的__slots__屬性

為什么有__slots__屬性?

默認情況下红且,python對象隊象的每個實例(instance)都會有一個字典來存儲該實例的屬性坝茎,這樣做的好處在于運行時期每個對象可以任意設置新的屬性。而相對應的壞處是暇番,當創(chuàng)建成百上千個這樣的實例的時候回很浪費內(nèi)存嗤放。所以引入__slots__,用來指定實例只擁有固定的屬性壁酬,因此python會給每個實例對象分配固定的內(nèi)存空間次酌,從而減少內(nèi)存消耗恨课。而且使用__slots__可以加快屬性的訪問。

用法

__slots__可以被設置成屬性名稱的字符串岳服,可遍歷的對象或者序列剂公。
之前在看odoo源碼緩存相關的內(nèi)容時,看到過下面這個例子:

class ormcache_counter(object):
    """ Statistic counters for cache entries. """
    __slots__ = ['hit', 'miss', 'err']

    def __init__(self):
        self.hit = 0
        self.miss = 0
        self.err = 0

    @property
    def ratio(self):
        return 100.0 * self.hit / (self.hit + self.miss or 1)

這里創(chuàng)建了一個用來記錄每個方法緩存情況的對象吊宋,因為對于需要每個緩存的方法纲辽,都會創(chuàng)建一個該實例來記錄緩存的狀況(比如緩存用到或沒用的次數(shù)等),所以為了節(jié)省內(nèi)存加快訪問速度這里指定了該對象擁有的三個屬性璃搜。

測試

訪問速度測試

timeit是python一個用來簡單測試運行時間的模塊拖吼,詳細可參見官方文檔

# In Python2.7

# test1.py
import timeit

class Foo(object): __slots__ = 'foo',

class Bar(object): pass

slotted = Foo()
not_slotted = Bar()

def get_set_delete_fn(obj):
    def get_set_delete():
        obj.foo = 'foo'
        obj.foo
        del obj.foo
    return get_set_delete


# In REPL
>>> from test1 import *
>>> min(timeit.repeat(get_set_delete_fn(not_slotted)))
min(timeit.repeat(get_set_delete_fn(not_slotted)))
0.24305510520935059
>>> min(timeit.repeat(get_set_delete_fn(slotted)))
min(timeit.repeat(get_set_delete_fn(slotted)))
0.21287798881530762

可以看見这吻,使用__slots__的對象有更快的訪問速度绿贞,雖然在python2.7中差別沒有在python3中那么明顯

內(nèi)存占用參考

關于內(nèi)存占用情況的測試我還沒測,但可以參考 stackoverflow上的測試,我這里機(無)智(恥)地取個結(jié)果:

# 單位 bytes
attrs  __slots__    no slots declared + __dict__
none       16        64 (+ 280 if __dict__ referenced)
one        56        64 + 280
two        64        64 + 280
six        96        64 + 1048
22        224        64 + 3352

可以明顯看到內(nèi)存占用減少的情況翘地。

注意事項

__dict__可以理解成類里面存儲屬性的字典堡距,

  1. 當一個類A繼承自一個沒有定義__slots__的類B時,A是有__dict__屬性拒名,這是再定義__slots__屬性沒有意義, 不能達到限制內(nèi)存的作用
  2. 當嘗試給一個定義了__slots__的類芋酌,而沒有定義__dict__的類設置不在__slots__指定的那些屬性時增显,會導致一個AttributeError
    其它注意請參照文檔
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脐帝,隨后出現(xiàn)的幾起案子同云,更是在濱河造成了極大的恐慌,老刑警劉巖堵腹,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炸站,死亡現(xiàn)場離奇詭異,居然都是意外死亡疚顷,警方通過查閱死者的電腦和手機旱易,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腿堤,“玉大人阀坏,你說我怎么就攤上這事“侍矗” “怎么了忌堂?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酗洒。 經(jīng)常有香客問我士修,道長妄迁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任李命,我火速辦了婚禮登淘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘封字。我一直安慰自己黔州,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布阔籽。 她就那樣靜靜地躺著流妻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆制。 梳的紋絲不亂的頭發(fā)上绅这,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音在辆,去河邊找鬼证薇。 笑死,一個胖子當著我的面吹牛匆篓,可吹牛的內(nèi)容都是我干的浑度。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼鸦概,長吁一口氣:“原來是場噩夢啊……” “哼箩张!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窗市,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤先慷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咨察,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论熙,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年扎拣,在試婚紗的時候發(fā)現(xiàn)自己被綠了赴肚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片素跺。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡二蓝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出指厌,到底是詐尸還是另有隱情刊愚,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布踩验,位于F島的核電站鸥诽,受9級特大地震影響商玫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牡借,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一拳昌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠龙,春花似錦炬藤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咬腋,卻和暖如春羹膳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背根竿。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工陵像, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寇壳。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓蠢壹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親九巡。 傳聞我的和親對象是個殘疾皇子图贸,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)冕广,斷路器疏日,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • 要點: 函數(shù)式編程:注意不是“函數(shù)編程”,多了一個“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钊龊骸傩浴?..
    victorsungo閱讀 1,524評論 0 6
  • Python進階框架 希望大家喜歡沟优,點贊哦首先感謝廖雪峰老師對于該課程的講解 一、函數(shù)式編程 1.1 函數(shù)式編程簡...
    Gaolex閱讀 5,502評論 6 53
  • 1. Java基礎部分 基礎部分的順序:基本語法睬辐,類相關的語法挠阁,內(nèi)部類的語法,繼承相關的語法溯饵,異常的語法侵俗,線程的語...
    子非魚_t_閱讀 31,668評論 18 399
  • 此文原型為刺客教條吧里一前輩及宋史高人的《刺客信條外傳:慶歷得仁》設定集,后經(jīng)之授權丰刊,我得以改編為小說形式隘谣,并增加...
    諸葛孔博閱讀 357評論 0 1