代码之家  ›  专栏  ›  技术社区  ›  minecraftplayer1234

读取Pythons内存分析器的输出

  •  10
  • minecraftplayer1234  · 技术社区  · 6 年前

    memory_profiler s输出。基本上,它看起来是这样的:

    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() . 我仔细检查了它是否是一个int的列表:

    print(sys.getsizeof(a))
    print(type(a[0]))
    

    这就是我得到的:

    87624
    <class 'int'>
    

    好吧,现在有个问题。正如我所检查的,f.e在Python中int的大小是 28 10000 * 28 =0.28 MB。以及 0.28 MB = 0.267028809 MiB (来自 内存分析器 正在显示MiB)。现在的问题是,桌子上有 0.328125 MiB 0.061096191 MB。

    旁白:为什么,这是什么时候 a 1000000 Increment 当我创建这行时,它的列是-9xxx MiB?我是说为什么是负数?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Holmes    6 年前

    Python列表并不存储对象本身,而是存储对对象的引用。64位版本的Python每个引用使用8个字节,因此 10000 80000 字节。从你的例子来看, sys.getsizeof(a) 87624 因为为了提高效率,列表会根据其大小按比例分配额外的空间。 See this post for more .

    int 取决于它的大小,但是 内景 这取决于 2^30-1 在64位Python上似乎需要28个字节(除了 0 87624 + 279996 = 367620 字节,大约 0.35 MiB

    这与 memory_profiler 可能是因为 this :

    系统内核关于当前进程的内存量 已分配,这可能与内存量略有不同 它实际上由Python解释器使用。还有,因为 垃圾收集器在Python中工作结果可能不同