包含大约 500 万个非零元素的 10,000 x 40,000 CSR 矩阵转储到/dev/null 中大约需要 6 分钟。有没有更快的选择?
将其转换为另一种稀疏格式无济于事。
目前的实现在 0.14 中非常幼稚。您可以尝试使用line_profiler对其进行分析以找到主要瓶颈。
如果您找到一种更快的实现方法(可以选择使用 cython 作为加载器),那么请随时打开拉取请求。
如果您升级到scikit-learn的前沿开发版本(或将此文件复制粘贴到您的安装中),您将获得比以前快十倍的dump_svmlight_file
。
编辑:忽略以下答案!实际上有一个基于Cython的dumper,由scikit-learn实现的作者提供。它可以在 3 秒内转储相同的矩阵。
以下内容在 60 秒内运行,其中 6 秒在循环之外运行。它利用了 COO 矩阵基本上已经采用正确格式的事实。
def dump_svmlight_file_sparse(X, y, f, zero_based=True):
X = X.sorted_indices().tocoo()
if not zero_based:
X.col += 1
y = y.astype(int).astype(str)
col = X.col.astype(str)
dat = X.data.astype(str)
last_row = 0
f.write(y[0])
for i in xrange(len(X.data)):
while last_row < X.row[i]:
last_row += 1
f.write('n'+y[last_row])
f.write(' '+col[i]+':'+dat[i])
f.write('n')