gpt4 book ai didi

python - python如何为列表和字符串分配内存?

转载 作者:行者123 更新时间:2023-12-04 08:45:31 26 4
gpt4 key购买 nike

这是我的python3测试代码:

#! /usr/bin/python3
from memory_profiler import profile

@profile(precision=10)
def f():
huge_list = [x for x in range(2000)]
del huge_list
print("finish")

if __name__ == "__main__":
f()
输出:
Line #    Mem usage    Increment   Line Contents
================================================
4 17.2109375000 MiB 17.2109375000 MiB @profile(precision=10)
5 def f():
6 17.2109375000 MiB 0.0000000000 MiB huge_list = [x for x in range(2000)]
7 17.2109375000 MiB 0.0000000000 MiB del huge_list
8 17.2226562500 MiB 0.0117187500 MiB print("finish")
它表明 huge_list = [x for x in range(2000)]不占用任何内存。
我把它改成了 huge_list = "aa" * 2000 , 一样的。
但是如果我将 2000 更改为 20000,它会获得一些内存。
为什么 ?
类似的问题在这里: What does “del” do exactly?

最佳答案

我不确定事情究竟是如何运作的,但我认为这就是会发生的事情:

  • 内存分析器不测量解释器实际使用的内存,而是测量整个过程的内存,如 memory-profiler 的常见问题解答中所述。 :

  • Q: How accurate are the results ?
    A: 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.


  • 如果解释器预先预留了足够的内存,以便新列表适合空闲的预留内存,那么进程就不需要更多的内存来预留。所以 memory-profiler 正确地打印出 0 的变化。毕竟大约 1000 个整数的列表并不是很大,所以如果解释器通常有一些空闲的保留内存,我不会感到惊讶。
  • 如果新的大列表所需的内存不适合已经保留的内存,则进程需要保留更多内存,内存分析器实际上会看到这些内存。
  • 阿巴纳特的 answerWhat does “del” do exactly?基本上是在说同样的事情。
  • 尽管如此,我的机器上的结果是不同的(在 win32 和 memory-profiler 0.57.0 上使用 Python 3.8.5,64 位(AMD64):
  •      Line #    Mem usage    Increment   Line Contents
    ================================================
    4 41.3984375000 MiB 41.3984375000 MiB @profile(precision=10)
    5 def f():
    6 41.4023437500 MiB 0.0039062500 MiB huge_list = [x for x in range(1)]
    7 41.4023437500 MiB 0.0000000000 MiB del huge_list
    8 41.4101562500 MiB 0.0078125000 MiB print("finish")

    所以我想这在很大程度上取决于系统......
    编辑:
    正如 Lescurel 在问题评论中所写:

    You should consider using tracemalloc if you want precise memory tracing of your app.

    关于python - python如何为列表和字符串分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64347984/

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