Python scipy.sparse 稀疏矩阵访问速度测试

最近做一个多标签的任务,需要对预测的top k index计算precision和nDCG。必要的一步是确定预测的index是否在groundtruth中。groundtruthy_dev是multi-hot形式,使用scipy中的稀疏矩阵存储。
判断i号样本的p号标签是否预测正确,只需要取 y_dev[i, p]的值即可(命中为1.0,不命中则为0.0),当数据量非常大时,访问的性能不可忽略。
scipy.sparse包下的稀疏矩阵有多种:
csr, csc, lil, dok和不支持位置索引取值的 coo, dia。

测试数据

wikipedia的一个多标签数据集的标签集合,是一个12959*29947的稀疏矩阵(12959个样本,29947个标签)

测试代码

Python scipy.sparse 稀疏矩阵访问速度测试

测试结果

Python scipy.sparse 稀疏矩阵访问速度测试

可以看到,13000次访问测试,列压缩稀疏矩阵csc是非常慢的,而链表稀疏矩阵lil则在50ms内就完成。因此在需要对稀疏矩阵的元素值做大量访问时,首先将待访问的稀疏矩阵做一个转换 sp.tolil() 是非常必要的。