【发布时间】:2017-04-21 05:24:40
【问题描述】:
我正在使用 scipy 的 csc 稀疏矩阵,目前代码中的主要瓶颈是类似于以下的一行
for i in range(multiply_cols.shape[0]):
F = F - factor*values[i]*mat.getcol(multiply_cols[i])
我正在使用的矩阵非常大,通常大于10**6x10**6,我不想将它们转换为密集矩阵。事实上,我有一个限制,即始终使用csc 格式的矩阵。我的尝试表明,转换为 coo_matrix 或 lil_matrix 也没有回报。
这是我使用csc、csr 和coo 的初步尝试:
n=1000
sA = csc_matrix(np.random.rand(n,n))
F = np.random.rand(n,1)
multiply_cols = np.unique(np.random.randint(0,int(0.6*n),size=n))
values = np.random.rand(multiply_cols.shape[0])
def foo1(mat,F,values,multiply_cols):
factor = 0.75
for i in range(multiply_cols.shape[0]):
F = F - factor*values[i]*mat.getcol(multiply_cols[i])
def foo2(mat,F,values,multiply_cols):
factor = 0.75
mat = mat.tocsr()
for i in range(multiply_cols.shape[0]):
F = F - factor*values[i]*mat.getcol(multiply_cols[i])
def foo3(mat,F,values,multiply_cols):
factor = 0.75
mat = mat.tocoo()
for i in range(multiply_cols.shape[0]):
F = F - factor*values[i]*mat.getcol(multiply_cols[i])
def foo4(mat,F,values,multiply_cols):
factor = 0.75
mat = mat.tolil()
for i in range(multiply_cols.shape[0]):
F = F - factor*values[i]*mat.getcol(multiply_cols[i])
我得到它们的时间:
In [41]: %timeit foo1(sA,F,values,multiply_cols)
10 loops, best of 3: 133 ms per loop
In [42]: %timeit foo2(sA,F,values,multiply_cols)
1 loop, best of 3: 999 ms per loop
In [43]: %timeit foo3(sA,F,values,multiply_cols)
1 loop, best of 3: 6.38 s per loop
In [44]: %timeit foo4(sA,F,values,multiply_cols)
1 loop, best of 3: 45.1 s per loop
所以coo_matrix 和lil_matrix 肯定不是一个好的选择。有谁知道这样做的更快方法。检索底层indptr、indices 和data 是否有自定义cython 解决方案是一个不错的选择?
【问题讨论】:
-
@TasamFarkie 我不知道你的基准有多好。一个有效的实现似乎很可能不涉及对空单元格进行工作,但您的测试矩阵已完全填充
-
那么,
sA是输入稀疏矩阵吗?如果是这样,我看不到它稍后会在代码中使用。 -
在
%timeit行中,它被传递给foo* -
啊,是的,错过了。谢谢@DavidW。
标签: python performance numpy scipy cython