python字典内存分析_Python减少字典对象占用的七成内存
程序執行過程中,如果RAM中有大量的對象在運行,就可能會出現內存問題,特別是在對可用內存總量有限的情況下。
下面是一些減少字典對象內存大小的方法,這些方法可以顯著減少對象所需的RAM大小。
字典
在Python里用字典來表示結構信息是非常方便的:
>>> ob = {'x':1, 'y':2, 'z':3}
>>> x = ob['x']
>>> ob['y'] = y
但我們來看看它的內存消耗:
>>> print(sys.getsizeof(ob))
240
這個數額看起來好像挺小,但是當你想要創造許多這樣的變量時就積小成多了:
解決方案
用類實例來代替字典:
class Point:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
>>> ob = Point(1,2,3)
>>> x = ob.x
>>> ob.y = y
類實例各個部分的內存大小:
如果你不是很了解類和實例,可以看廖雪峰的這篇文章。這里的__weakref__是對這個對象的弱引用列表的引用,而__dict__是對類實例字典的引用,它包含實例屬性的值。從Python 3.3開始, 類的所有實例用共享空間存儲字典的keys. 這減少了內存中實例的大小:
>>> print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))
56 112
56+112=168 < 240. 因此,大量的類實例占用的內存比普通字典(dict)要少:
字典占實例大小的百分比為112/168=67%, 我們還是可以看出,實例中字典的大小嚴重影響了RAM中實例的大小。
帶__slots__的類實例
通過消除__dict__和weakref__,可以顯著減少RAM中的類實例的大小。用__slots__是有可能做到的:
class Point:
__slots__ = 'x', 'y', 'z'
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
>>> ob = Point(1,2,3)
>>> print(sys.getsizeof(ob))
64
RAM中的對象明顯變小:
FieldSize (bytes)PyGC_Head24PyObject_HEAD16x8y8z8TOTAL:64
今日重點:在類定義中使用__slots__會顯著減少大量實例的內存占用
目前,這是大幅度減少RAM中類實例的內存占用的主要方法。相比于單純用字典,減少了(240-64)/240=73%的內存占用。
文章到此就結束啦,如果你喜歡今天的Python 教程,請持續關注Python實用寶典,如果對你有幫助,麻煩在下面點一個贊/在看哦
有任何問題都可以在下方留言區留言,我們會耐心解答的!
?Python實用寶典 (pythondict.com)
不只是一個寶典
歡迎關注公眾號:Python實用寶典
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的python字典内存分析_Python减少字典对象占用的七成内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonexcelweb交互插件_来
- 下一篇: sql 时间范围查询_Excel中使用S