直接用numpy.ndarray存极稀疏矩阵会导致内存爆炸,必须用scipy.sparse的CSR/CSC格式并及时转换,配合适配稀疏计算的函数(如svds、cg),否则无法运行或严重低效。

因为直接用 numpy.ndarray 存极稀疏矩阵,不是慢一点,而是根本跑不起来——内存先爆,计算再卡。
内存占用差 10–100 倍,不是夸张
一个 100 万 × 100 万的用户-物品交互矩阵,若只有 0.001% 非零(约 1e6 个非零项),用 numpy.float64 密集存储需 800 GB;而 scipy.sparse.csr_matrix 只存三组整数索引 + 一组值,通常不到 100 MB。这不是“省点内存”,是“能不能加载进内存”的分水岭。
常见误操作:
- 从 CSV 读完再 np.array() → 内存瞬间打满
- 用 pandas.get_dummies() 后没转稀疏 → 稠密 one-hot 把 10 万维 categorical 特征撑爆 RAM
dot() 运算在 CSR/CSC 下才真正走稀疏路径
scipy.sparse 的 dot() 或 @ 运算符,只在 csr_matrix 和 csc_matrix 上调用底层 C 实现的稀疏乘法;其余格式如 coo_matrix、lil_matrix 调用 @ 时会静默转成 CSR/CSC——不报错,但多一次拷贝+排序,慢 5–10 倍。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
- 构建完立刻转:mat = mat.tocsr() 或 .tocsc(),别等第一次计算才触发隐式转换
- 验证是否生效:print(type(mat)) 必须是 scipy.sparse.csr_matrix,不是 coo_matrix
- 行优先查(如按用户取向量)选 CSR;列优先查(如按物品聚合)选 CSC
很多“看起来通用”的函数根本不适配稀疏输入
sklearn.metrics.pairwise_distances 对 csr_matrix 默认全量展开成密集数组,哪怕只是算 1000 个用户的余弦距离,也可能触发 MemoryError;np.linalg.svd 不支持稀疏矩阵,必须用 scipy.sparse.linalg.svds。
容易踩的坑:
- 用 mat.sum(axis=1) 在 lil_matrix 上比在 csr_matrix 上慢 3 倍以上
- 调 mat.toarray() 试图“方便调试” → 一执行就 OOM
- 在 ALS 训练中传给 scipy.sparse.linalg.cg 的矩阵未归一化 → 收敛失败,报 ConvergenceWarning: CG iteration did not converge
真正关键的不是“用了 sparse”,而是格式选对、转换及时、函数对口——稀疏性本身不加速,**稀疏格式 + 匹配算法** 才让大模型训练和实时推荐成为可能。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










