gpt4 book ai didi

python - Python 集合消耗的内存量逐步增加

转载 作者:太空狗 更新时间:2023-10-30 00:08:57 24 4
gpt4 key购买 nike

我做了一个实验,看看每个Python数组类型占用多少内存,分别是list, tuple, set, 字典, np.array。然后我得到了以下结果。

The amount of memory Python array types spend

(x轴为数组长度,y轴为内存大小。)

我发现 Python set 消耗的内存量按步长增加(也是 dict),而其他的内存量如我预期的那样线性增加。我想知道是什么让它们与众不同。

我使用了以下 get_size() 函数。 ( reference )

def get_size(obj, seen = None):
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([get_size(v, seen) for v in obj.values()])
size += sum([get_size(k, seen) for k in obj.keys()])
elif hasattr(obj, '__dict__'):
size += get_size(obj.__dict__, seen)
elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
size += sum([get_size(i, seen) for i in obj])
return size

并且我以 100 个间隔测量了从长度 0 到 10,000 的内存。

我的代码:https://repl.it/repls/WanEsteemedLines

最佳答案

CPython 集合和字典总是使用一个二次方大小的内部哈希表。 listtuplenumpy.ndarray 在其底层内存缓冲区的大小方面都具有更大的灵 active ,但是 setdict 被硬编码为使用 2 的幂表大小。该实现无法使用非二次方的表大小。参见 Objects/dictobject.cObjects/setobject.c .

图表中的跳跃是当表格大小跳到新的 2 的幂时。

顺便说一下,您的get_size 效果不是很好。例如,它有两个影响 numpy.ndarray 案例的错误几乎抵消了(但不完全是)。它尝试将 NumPy 数组元素的大小添加到整个数组的大小,但对于 NumPy 数组,元素的大小已经由 getsizeof 计算在内。此外,它使用 id 确定对象标识,但是通过遍历 NumPy 数组生成的对象是动态创建并立即消亡的,因此它们的 id 值不是唯一的.实际上,这可能会将表示数组元素的对象的大小多算一倍或两倍。

关于python - Python 集合消耗的内存量逐步增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831069/

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