gpt4 book ai didi

python - 读取 Python 的 memory_profiler 的输出

转载 作者:太空狗 更新时间:2023-10-29 18:33:14 27 4
gpt4 key购买 nike

我无法理解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() 测量了这个列表的大小。我仔细检查了它是否实际上是一个整数列表:

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 中构建列表真的需要大量内存,还是我以错误的方式解释了某些内容?

还有 P.S:为什么,当这个 a 列表的长度为 1000000 时,该行的 Increment 列中的数字,当我正在创建它,就像 -9xxx MiB?我的意思是为什么是负数?

最佳答案

Python 列表不存储对象本身,而是存储对对象的引用。 64 位版本的 Python 每个引用使用 8 个字节,因此 10000 整数需要 80000 字节。在您的示例中,sys.getsizeof(a) 返回了 87624,因为为了提高效率,列表分配与其大小成比例的额外空间。 See this post for more .

int 占用的空间取决于它的大小,但 int 最多 2^30-1 似乎在 64 位 Python 上占用 28 个字节(0 除外,它只占用 24 个字节)。所以总的来说,列表占用的大小是 87624 + 279996 = 367620 字节,大约是 0.35 MiB

这与 memory_profiler 的输出之间的差异可能是由于 this :

This module gets the memory consumption by querying the operating system kernel about the amount of memory the current process has allocated, which might be slightly different from the amount of memory that is actually used by the Python interpreter. Also, because of how the garbage collector works in Python the result might be different between platforms and even between runs.

关于python - 读取 Python 的 memory_profiler 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com