30万×30万稀疏矩阵与数组相乘的加速方法咨询
高效稀疏矩阵与向量相乘的优化方案
1. 改用Scipy稀疏矩阵库
NumPy的matmul是为稠密矩阵优化的,面对大规模稀疏矩阵时会做大量无意义的零元素运算,而scipy.sparse模块专门针对稀疏场景优化,其中CSR(Compressed Sparse Row)格式是矩阵-向量乘法的最优选择。
示例代码:
import scipy.sparse as sp import numpy as np # 将现有矩阵转为CSR格式(若从原始稀疏数据构造更高效) sparse_mat = sp.csr_matrix(your_dense_matrix) vector = np.random.rand(300000) # 执行乘法 result = sparse_mat.dot(vector)
CSR通过压缩存储非零元素,彻底规避零元素运算,能大幅降低计算量和内存占用,速度远优于NumPy的稠密矩阵乘法。
2. 直接构造稀疏矩阵
如果你的矩阵来自原始稀疏数据(如非零元素的坐标列表),不要先转稠密矩阵再转稀疏,直接用Scipy构造函数创建CSR矩阵,避免不必要的内存开销:
# 示例:通过行索引、列索引、非零值构造 rows = np.array([0, 2, 50000]) cols = np.array([1, 3, 100000]) data = np.array([1.2, 3.4, 5.6]) sparse_mat = sp.csr_matrix((data, (rows, cols)), shape=(300000, 300000))
3. 启用多线程优化
Scipy的稀疏运算依赖底层BLAS/LAPACK库,确保使用OpenBLAS、MKL这类支持多线程的优化库,再通过环境变量开启多线程:
export OMP_NUM_THREADS=8 # 根据CPU核心数调整
4. 简化向量格式
确保输入向量是一维numpy.ndarray,不要用二维数组(会触发矩阵-矩阵乘法逻辑),若为二维可通过vector.flatten()转为一维。
内容的提问来源于stack exchange,提问作者Saurabh Agarwal
相关产品推荐
相关产品推荐

