gpt4 book ai didi

占用太多内存的对象的Python列表

转载 作者:太空狗 更新时间:2023-10-30 02:44:33 25 4
gpt4 key购买 nike

我有以下代码,它创建了类 foo 的一百万个对象:

for i in range(1000000):
bar = foo()
list_bar.append(bar)

bar 对象只有 96 字节,由 getsizeof() 确定。但是,追加步骤需要将近 8GB 的​​内存。一旦代码退出循环,ram 使用量就会下降到预期的数量(列表的大小 + 一些开销~103MB)。只有在循环运行时,ram 使用率才会飙升。为什么会这样?任何解决方法?PS:使用生成器不是一个选项,它必须是一个列表。

编辑: xrange 没有帮助,使用 Python 3。内存使用率仅在循环执行期间保持高位,并在循环结束后下降。 append 会不会有一些不明显的开销?

最佳答案

这很可能是由于 foo() 构造函数进行了一些意外的周期性 引用;通常 Python 对象会在引用计数降为零时立即释放内存;现在,当垃圾收集器有机会运行时,这些将在稍后被释放。

您可以尝试在 10000 次迭代后强制运行 GC,以查看它是否保持内存使用量不变。

import gc
n = 1000000
list_bar = [ None ] * n
for i in range(n):
list_bar[i] = foo()
if i % 10000 == 0:
gc.collect()

如果这减轻了内存压力,那么内存使用是因为一些引用循环。


列表的大小调整有一些开销。如果你知道有多少元素,那么你可以预先创建列表,例如:

list_bar = [ foo() for _ in xrange(1000000) ]

应该知道数组的大小而不需要调整它的大小;或创建包含 None 的列表:

n = 1000000
list_bar = [ None ] * n
for i in range(n):
list_bar[i] = foo()

append 应该使用 realloc 来增加列表,但旧的内存应该尽快释放;总而言之,对于最后为 100 MB 的列表,分配的所有内存的开销不应总计为 8G;操作系统可能错误地计算了所使用的内存。

关于占用太多内存的对象的Python列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985815/

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