gpt4 book ai didi

python - 为什么即使没有引用大对象,Python 2 也会消耗大量内存?

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:51 25 4
gpt4 key购买 nike

考虑以下最小示例:

# used memory: Python2=7421 MB, Python3=7440 MB
a = list(range(10**8))
# used memory: Python2=10553 MB, Python3=11317 MB
a = 1
# used memory: Python2=9785 MB, Python3=7454 MB
# ---> why does Python2 need >2GB of RAM here?

# after python process terminates: Python2=7433 MB, Python3=7458 MB

创建了一个大对象,应该在第二行之后进行垃圾回收。已使用 free -m 监控内存使用情况(当然这不是精确测量)。

Python 3 需要更多内存(3.7GB 而不是 3.05GB)来存储大对象,但它符合我的预期:不再需要对象后内存使用率下降。 Python2 似乎只删除了 768 MB 并保留了 2.3GB 的内存分配。为什么?

这是可重复的:如果第二次创建该列表,它将再次使用 3.05 GB,而不是更多,它会再次下降到 2.3GB RAM 使用量。 gc.collect() 返回 0 并且不改变已用内存量。

请不要告诉我使用 Python 3 - I know ...:)

一些文档链接没有回答我的问题:

最佳答案

在 Python 2 上回收整数的特定情况下,内存卡在无限制的 free list 上并没有返回到操作系统。因此,为 int 保留的内存与程序中同时存在的最大 int 数成正比,而不是与当前存在的 int 数成正比。

对于其他内存未返回操作系统的情况,这可能是由于底层 malloc 分配器的细节所致。我能想到的大多数其他 Python 自由列表都是有界的。

关于python - 为什么即使没有引用大对象,Python 2 也会消耗大量内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46835245/

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