【问题标题】:memory profiling: list comprehension vs. numpy array内存分析:列表理解与 numpy 数组
【发布时间】:2017-07-19 22:25:14
【问题描述】:

我正在尝试执行列表与 numpy 数组的内存分析。

%%file memory.py

import numpy as np

@profile
def allocate():
    vector_list = [float(i) for i in range(10000)]
    np.arange(0,10000,dtype='d')

allocate()

在 shell 中运行内存分析器:

!python -m memory_profiler memory.py

给出以下输出:

Line #    Mem usage    Increment   Line Contents
================================================
     4   39.945 MiB    0.000 MiB   @profile
     5                             def allocate():
     6   39.949 MiB    **0.004 MiB**       vector_list = [float(i) for i in range(10000)]
     7   40.039 MiB    **0.090 MiB**       np.arange(0,10000,dtype='d')

第 6 行与第 7 行的内存增量表明 numpy 数组比列表更昂贵。我做错了什么?

【问题讨论】:

  • 我无法重现您的结果...
  • 由于您对这两个非常感兴趣,您可以使用sys.getsizeof(对于列表和np.arange 对象应该可以很好地工作)检查两个对象的大小,而不是广泛依赖内存分析工具。
  • @MosesKoledoye 是的,但是您必须掌握 CPython 内部结构才能正确使用 sys.getsizeof。例如,您需要sum(map(sys.getsizeof, vector_list)) + sys.getsizeof(vector_list) 才能准确了解vector_list 的内存使用情况。还有sys.getsizeof(np.arange(0,10000))
  • @MosesKoledoye 换句话说,sys.getsizeoflist 天真地 工作得相当好。如果您使用vector_list 执行此操作,它将关闭大约240000 字节
  • @MosesKoledoye 是的。查看my answer here,虽然,最初的问题是关于一堆dicts 的内存使用情况。但我将探讨numpy 如何非常 节省内存,但它也展示了获取 Python 容器的实际内存使用情况的微妙之处。例如。字符串实习,小整数缓存等

标签: python arrays numpy


【解决方案1】:

我不知道什么是内存分析器报告 - 我从你那里得到的数字非常不同:

Line #    Mem usage    Increment   Line Contents
================================================
     3   41.477 MiB    0.000 MiB   @profile
     4                             def allocate():
     5   41.988 MiB    0.512 MiB       vector_list = [float(i) for i in range(10000)]
     6   41.996 MiB    0.008 MiB       np.arange(0,10000,dtype='d')

我建议您阅读以下两个链接:Python memory usage of numpy arraysSize of list in memory

我还修改了你的代码如下:

import numpy as np
import sys

@profile
def allocate():
    vector_list = [float(i) for i in range(10000)]
    npvect = np.arange(0,10000,dtype='d')
    listsz = sum(map(sys.getsizeof, vector_list)) + sys.getsizeof(vector_list)
    print("numpy array size: {}\nlist size: {}".format(npvect.nbytes, listsz)) 
    print("getsizeof(numpy array): {}\n".format(sys.getsizeof(npvect))) 

allocate()

它输出:

numpy array size: 80000
list size: 327632
getsizeof(numpy array): 80096

【讨论】:

  • 这没有正确考虑到 list 所需的内存。你需要使用sum(map(sys.getsizeof, vector_list)) + sys.getsizeof(vector_list)
  • 我已经编辑了我的答案以考虑您的评论。谢谢! @juanpa.arrivillaga
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2011-06-23
  • 2011-03-23
  • 2013-01-29
  • 2018-12-01
  • 1970-01-01
  • 2022-01-25
  • 2019-03-02
相关资源
最近更新 更多