繁体   English   中英

读取Python的输出memory_profiler

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM