python中getsizeof和asizeof的區(qū)別小結
sys.getsizeof (Python 內置)
1、來源: Python 標準庫的 sys 模塊
2、功能: 返回對象的"直接"內存占用,不包括對象引用的其他對象
3、特點:
3.1、只計算對象本身的大小
3.2、對于容器類型(list, dict等),不計算容器內元素的大小
3.3、是Python內置函數,無需額外安裝
pympler.asizeof.asizeof (第三方庫)
1、來源: Pympler 庫的 asizeof 模塊
2、功能: 遞歸計算對象及其所有引用對象的總內存占用
3、特點:
3.1、遞歸計算所有引用對象的大小
3.2、對于容器類型,會計算容器內所有元素及其引用的大小
3.3、需要安裝 pympler 包 (pip install pympler)
使用場景
1、使用 sys.getsizeof 當你想知道對象本身的內存占用
2、使用 asizeof.asizeof 當你想知道對象及其所有引用對象的完整內存占用
對于復雜數據結構,asizeof 通常能給出更準確的總內存使用情況。
In [88]: aa=["a"] In [89]: getsizeof(aa) Out[89]: 64 In [90]: hex(id(aa)) Out[90]: '0x24ca6152480' In [91]: getsizeof(aa[0]) Out[91]: 50 In [92]: hex(id(aa[0])) Out[92]: '0x24ca2104cf0'
1、getsizeof和id的對像是一樣的,也就是說getsizeof獲取的不是這個列表以及所有內容在內存中的有效占用空間,而僅僅是這個列表表頭的占用空間。

這是表頭,即aa,選中的是他的元素表

這里大概就是存儲相關指針的一段空間

這是元素aa[0]
In [93]: aa.__iadd__("b")
Out[93]: ['a', 'b']
In [95]: getsizeof(aa)
Out[95]: 96
In [96]: hex(id(aa))
Out[96]: '0x24ca6152480'
In [98]: aa[1]="bb"
In [100]: getsizeof(aa)
Out[100]: 96

指針地址沒變,但是長度變了,至于后面多出的長度描述了什么,未知。但第二行標志著有多少個元素,第二行后段仍是元素指針的地址

這里的指針應該是單純的信息,前后無其他描述信息,靠著上上圖中的元素數量索引

第一次增加元素,賦值為b,第二次增加aa[1]的長度,但aa的size未變,aa的size至與元素數量有關,也可能與元素類型有關。
看到列表了,里面有個函數
__sizeof__(self, /) Return the size of the list in memory, in bytes.
好奇探究,又做了無意義的事!
到此這篇關于python中getsizeof和asizeof的區(qū)別小結的文章就介紹到這了,更多相關python getsizeof asizeof 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python GUI庫圖形界面開發(fā)之PyQt5窗口背景與不規(guī)則窗口實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5窗口背景與不規(guī)則窗口實例,需要的朋友可以參考下2020-02-02

