读取Pythons memory_profiler的输出

min*_*234 10 python memory-profiling python-3.x

我对理解memory_profilers输出有疑问.基本上,它看起来像这样:

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)]
Run Code Online (Sandbox Code Playgroud)

在第9行,我们可以清楚地看到,我们使用了一些记忆.现在,我测量了这个列表的大小sys.getsizeof().我仔细检查它是否实际上是一个整数列表:

print(sys.getsizeof(a))
print(type(a[0]))
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

87624
<class 'int'>
Run Code Online (Sandbox Code Playgroud)

好吧,现在有一个问题.正如我所检查的那样,28在我的64位Windows机器上,Python中的int是大小的.我不知道这是否正确.但是就算是这样.10000 * 28= 0.28 MB.并且0.28 MB = 0.267028809 MiB(memory_profiler显示MiB 的输出).现在的问题是,在表中有0.328125 MiB,所以差异是0.061096191MB.

我关心的是,在Python中构建列表需要大量的内存,还是我以错误的方式解释某些内容?

和PS:为什么,当这个a列表长度时1000000,Increment这行的列中的数字,当我创建它时,就像-9xxx MiB?我的意思是为什么负数?

小智 6

Python列表不存储对象本身,而是存储对象的引用.64位版本的Python每个引用使用8个字节,因此10000int需要80000字节.从您的示例sys.getsizeof(a)返回,87624因为效率,列表分配与其大小成比例的额外空间.看到这个帖子的更多.

通过采取的空间int取决于它是多么大,但ints到2^30-1似乎采取64位的Python(除28个字节0,这只需24个字节).总的来说,列表占用的大小是87624 + 279996 = 367620字节,大约是0.35 MiB.

这一点,从输出之间的差异memory_profiler可能是由于这个:

此模块通过查询操作系统内核有关当前进程已分配的内存量来获取内存消耗,这可能与Python解释器实际使用的内存量略有不同.此外,由于垃圾收集器在Python中的工作方式,平台之间甚至运行之间的结果可能不同.