【发布时间】: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.getsizeof与list天真地不 工作得相当好。如果您使用vector_list执行此操作,它将关闭大约240000字节 -
@MosesKoledoye 是的。查看my answer here,虽然,最初的问题是关于一堆
dicts 的内存使用情况。但我将探讨numpy如何非常 节省内存,但它也展示了获取 Python 容器的实际内存使用情况的微妙之处。例如。字符串实习,小整数缓存等