2 回答

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
基本上,pythons類和實(shí)例都是對(duì)象。當(dāng)您測(cè)試的大小時(shí)MyClass(),您正在查詢實(shí)例對(duì)象的內(nèi)存大小,而當(dāng)您針對(duì)進(jìn)行查詢時(shí)MyClass,您正在測(cè)試類對(duì)象的大小。
這兩個(gè)對(duì)象都有各自的字段,這就是為什么大小不同的原因,并且類對(duì)象比實(shí)例需要更多的內(nèi)存也就不足為奇了。
python中類的實(shí)例是一種字典,將名稱與python對(duì)象(函數(shù),字段等)相關(guān)聯(lián)。實(shí)際上,它們存儲(chǔ)在MyClass().__dict__字典中。因此,如果您向類中添加更多字段,則大小不會(huì)改變,因?yàn)樵擃愔赶騙_dict__依次存儲(chǔ)這些字段的對(duì)象。
測(cè)試sys.getsizeof(MyClass().__dict__)收益率也是固定的。因?yàn)閜ython字典將其鍵存儲(chǔ)在keys列表中,并將其值存儲(chǔ)在values列表中(具有智能哈希關(guān)聯(lián)等)。
因此,如果您希望看到班級(jí)規(guī)模的增長(zhǎng),可以這樣做:
從ipython轉(zhuǎn)儲(chǔ)
In [11]: class A():
....: def __init__(self, **kwargs):
....: for k,a in kwargs.items():
....: self.__dict__[k]=a
....:
....:
In [14]: a1 = A(a=2)
In [15]: a2 = A(a=2,b=3,c='aaaa')
In [16]: import sys
In [17]: sys.getsizeof(a1.__dict__)
Out[17]: 140
In [18]: sys.getsizeof(a2.__dict__)
Out[18]: 140
In [19]: sys.getsizeof(a1.__dict__.keys())
Out[19]: 40
In [20]: sys.getsizeof(a2.__dict__.keys())
Out[20]: 48
In [21]: sys.getsizeof(a2.__dict__.keys()+a2.__dict__.values())
Out[21]: 60
In [22]: sys.getsizeof(a1.__dict__.keys()+a2.__dict__.values())
Out[22]: 52
希望這可以為您解釋一些事情。
添加回答
舉報(bào)