numpy 数组字典真的比 ndarray 使用更少的内存吗?
Does a dictionary of numpy arrays really use less memory than an ndarray?
我正在尝试寻找一种内存高效的方法来将数据存储在 python 变量中以便快速访问和分析。我在 numpy
中初始化一个 2d 数组,然后通过以下方式找到它的内存使用情况(使用 sys
以便稍后与其他变量类型进行比较):
a = np.zeros((1000,1000), dtype=np.float32)
print('The size of the numpy array is {} bytes'.format(sys.getsizeof(a)))
哪个returns:The size of the numpy array is 4000112 bytes
我可以使用以下 for 循环将其移动到 1d numpy
数组的字典中:
b = {}
for ii in range(1000):
b[f'{ii}']=a[:,ii]
print('The size of the dictionary is {} bytes'.format(sys.getsizeof(b)))
其中 returns:The size of the dictionary is 36968 bytes
。即使我删除 a
和 运行 垃圾收集,字典大小仍然存在,因此 b
不能只是指向 a
.
的容器
为什么一维数组的字典比 ndarray 中的相同数组占用更少的内存?
你的观察有两个根本性的错误。
您不能删除对象,只能删除引用。如果删除 a
,则删除指针。当您删除所有指针时,只有对象 可能 在某个时候被垃圾收集器删除
sys.getsizeof
只给出了容器的大小。要获得总大小,您需要遍历元素并求和。
证明尺寸大致相同:
b = {}
for ii in range(1000):
b[f'{ii}']=a[:,ii].copy()
sum(sys.getsizeof(e) for e in b.values())
# 4096000
我正在尝试寻找一种内存高效的方法来将数据存储在 python 变量中以便快速访问和分析。我在 numpy
中初始化一个 2d 数组,然后通过以下方式找到它的内存使用情况(使用 sys
以便稍后与其他变量类型进行比较):
a = np.zeros((1000,1000), dtype=np.float32)
print('The size of the numpy array is {} bytes'.format(sys.getsizeof(a)))
哪个returns:The size of the numpy array is 4000112 bytes
我可以使用以下 for 循环将其移动到 1d numpy
数组的字典中:
b = {}
for ii in range(1000):
b[f'{ii}']=a[:,ii]
print('The size of the dictionary is {} bytes'.format(sys.getsizeof(b)))
其中 returns:The size of the dictionary is 36968 bytes
。即使我删除 a
和 运行 垃圾收集,字典大小仍然存在,因此 b
不能只是指向 a
.
为什么一维数组的字典比 ndarray 中的相同数组占用更少的内存?
你的观察有两个根本性的错误。
您不能删除对象,只能删除引用。如果删除
a
,则删除指针。当您删除所有指针时,只有对象 可能 在某个时候被垃圾收集器删除sys.getsizeof
只给出了容器的大小。要获得总大小,您需要遍历元素并求和。
证明尺寸大致相同:
b = {}
for ii in range(1000):
b[f'{ii}']=a[:,ii].copy()
sum(sys.getsizeof(e) for e in b.values())
# 4096000