为何将稠密数组转为稀疏数组后代码运行更快?
稠密与稀疏矩阵转换后核心计算耗时差异的原因分析
- 内存布局差异:从CSR稀疏矩阵通过
toarray()得到的numpy数组是**C连续(C-contiguous)**内存布局,而原始dense.npy存储的数组可能是Fortran连续或非连续的。numpy的向量化运算依赖底层BLAS/LAPACK库,这类库对连续内存的计算做了深度优化,执行效率远高于非连续内存的情况。 - CPU缓存命中率差异:连续内存布局的数组在计算时,CPU缓存可以批量加载连续的内存块,大幅减少缓存未命中的次数;非连续内存的数组则会频繁触发缓存失效,导致CPU需要等待内存数据加载,直接拖慢核心计算步骤的耗时。
- 数据对齐优化:CSR矩阵转成numpy数组时,会自动完成严格的内存对齐(比如适配CPU缓存行的64字节对齐),而原始稠密数组可能缺少这种对齐处理。对齐后的内存访问能让CPU更高效地执行指令,进一步提升计算速度。
尽管场景2中存在稀疏矩阵切片、转稠密数组的额外开销,但核心计算步骤的耗时减少幅度远大于这些额外开销,最终总耗时反而比直接操作原始稠密数组更短,且数组规模越大,这种差异会越明显。
内容的提问来源于stack exchange,提问作者RNA
相关产品推荐
相关产品推荐

