百万级Scipy稀疏矩阵转Tensorflow Sparse Tensor过慢,求优化方法
Scipy CSR稀疏矩阵转TensorFlow Sparse Tensor 提速方案
针对超大规模(百万级行列)CSR矩阵转换耗时过长的问题,可通过以下几个方向优化:
1. 优化索引生成逻辑
原代码中np.mat([coo.row, coo.col]).transpose()会额外创建矩阵对象,对超大规模数据来说内存和时间开销极大。改用更高效的numpy数组拼接方式:
# 直接构造二维索引数组,避免矩阵对象和多余转置操作 indices = np.column_stack((coo.row, coo.col)) # 或者用stack方式,效果一致但更直观 indices = np.stack([coo.row, coo.col], axis=1)
2. 提前指定数据类型,减少内存拷贝
原代码先转COO格式再执行astype(np.float32),会生成额外的数据副本。可在转COO时直接指定目标类型,省去一次内存复制:
coo = norm_adj_mat.tocoo(dtype=np.float32)
3. 使用TensorFlow原生转换API(最优方案)
TensorFlow 2.x提供了tf.sparse.from_scipy_sparse_matrix原生函数,可直接将Scipy的CSR/COO等稀疏矩阵转换为TensorFlow SparseTensor,底层采用优化的C++实现,跳过手动构造索引的低效步骤:
# 直接转换,无需手动转COO或构造索引 A_tilde = tf.sparse.from_scipy_sparse_matrix(norm_adj_mat.astype(np.float32))
若原矩阵的数据类型已符合要求(如float32),可省略astype操作进一步提速。
内容的提问来源于stack exchange,提问作者xerxes01
相关产品推荐
相关产品推荐

