You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从np.ndarray创建的scipy稀疏矩阵内存显示仅为48字节?

关于Scipy稀疏矩阵sys.getsizeof返回固定48字节的原因

问题背景

从事科学计算研究时,需处理大型密集矩阵:单任务要创建60个60000×60000的np.complex128类型矩阵,仅对角线60000个元素为0。因16GB内存不足,尝试用Scipy稀疏矩阵优化,发现转换为csc_matrix后,sys.getsizeof()始终返回48字节,即使扩大矩阵规模也不变。已验证稀疏矩阵与原密集矩阵的数值完全一致,现解释该现象原因。

核心原因

sys.getsizeof()仅统计Python对象本身的内存占用,而Scipy稀疏矩阵(如csc_matrix)的核心数据(非零元素值、行索引、列指针)都存储在内部的Numpy数组中,这些数组的内存并不会被sys.getsizeof()计入。

csc_matrix对象本质只是一个轻量级容器,仅包含指向内部数组的引用、矩阵形状、存储格式等元数据,这些元数据的内存占用很小,因此不管矩阵规模多大,sys.getsizeof()返回的数值基本固定(约48字节)。

查看稀疏矩阵实际内存占用

要获取稀疏矩阵真实的内存消耗,需统计其内部存储数组的内存总和:

# 计算csc_matrix实际占用内存
actual_memory = C.data.nbytes + C.indices.nbytes + C.indptr.nbytes
print(actual_memory)

以测试代码中的n=1000为例:

  • C.data存储999000个complex128元素,每个占16字节,共999000*16=15984000字节
  • C.indices存储非零元素的行索引,默认是int32类型,共999000*4=3996000字节
  • C.indptr存储列指针,共1001个int32元素,共1001*4=4004字节
    三者总和约19984004字节,远大于sys.getsizeof()返回的48字节,这才是稀疏矩阵实际占用的内存。

测试代码与输出

测试代码

import numpy as np
from scipy.sparse import csc_matrix
import sys

n = 1000
A = np.random.uniform(1.0, 10.0, size=(n, n)) + 1j*np.random.uniform(1.0, 10.0, size=(n, n))
np.fill_diagonal(A, 0)
C = csc_matrix(A)

print(sys.getsizeof(A))
print(sys.getsizeof(C))

输出

16000128
48

稀疏矩阵信息

<1000x1000 稀疏矩阵,类型为 '<class 'numpy.complex128'>',采用压缩稀疏列(Compressed Sparse Column)格式存储,包含999000个非零元素>

内容的提问来源于stack exchange,提问作者gradctp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:42:49