[英]Reading the output of Pythons memory_profiler
我在理解memory_profiler
的輸出時memory_profiler
了問題。 基本上,它看起來像這樣:
Filename: tspviz.py
Line # Mem usage Increment Line Contents
================================================
7 34.589844 MiB 34.589844 MiB @profile(precision=6)
8 def parse_arguments():
9 34.917969 MiB 0.328125 MiB a = [x**2 for x in range(10000)]
在第9行,我們可以清楚地看到,我們使用了一些內存。 現在,我使用sys.getsizeof()
測量了此列表的大小。 我仔細檢查了它是否實際上是一個int列表:
print(sys.getsizeof(a))
print(type(a[0]))
這就是我得到的:
87624
<class 'int'>
好吧,現在有個問題。 正如我所檢查的,在我的64位Windows計算機上,Python中的int大小為28
。 我不知道那是不是正確的。 但即便如此。 10000 * 28
= 0.28 MB。 和0.28 MB = 0.267028809 MiB
(從輸出memory_profiler
正在顯示MIB)。 現在的問題是,表中存在0.328125 MiB
,因此差異為0.061096191
MB。
我的擔心是,在Python中構造列表是否真的需要大量內存,還是我以錯誤的方式解釋了某些內容?
而PS:為什么,當這a
名單是長的1000000
,在人數Increment
此行,當我創建它列,就像-9xxx MIB? 我的意思是為什么負數?
Python列表不存儲對象本身,而是存儲對象的引用。 Python的64位版本每個引用使用8個字節,因此10000
整數需要80000
個字節。 在您的示例中, sys.getsizeof(a)
返回87624
因為出於效率考慮,列表分配了與其大小成比例的額外空間。 有關更多信息,請參見此帖子 。
一個int
占用的空間取決於它的大小,但在64位Python上,最大為2^30-1
int
似乎占用28個字節( 0
除外,僅占用24個字節)。 因此,該列表的總大小為87624 + 279996 = 367620
字節,大約0.35 MiB
。
這與memory_profiler
的輸出之間的差異可能是由於以下原因 :
該模塊通過查詢操作系統內核當前進程已分配的內存量來獲取內存消耗,這可能與Python解釋器實際使用的內存量略有不同。 另外,由於垃圾收集器在Python中的工作方式,結果在平台之間甚至在運行之間也可能有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.