将包含约 500 万个非零元素的 10,000 x 40,000 CSR 矩阵转储到 /dev/null 大约需要 6 分钟。有更快的选择吗?
将其转换为另一种稀疏格式并没有帮助。
将包含约 500 万个非零元素的 10,000 x 40,000 CSR 矩阵转储到 /dev/null 大约需要 6 分钟。有更快的选择吗?
将其转换为另一种稀疏格式并没有帮助。
当前的实现在 0.14 中非常幼稚。您可以尝试使用line_profiler对其进行分析以找到主要瓶颈。
如果您找到一种更快的方法来实现它(可选地使用 cython 作为加载器),那么请随时打开拉取请求。
如果您升级到 scikit-learn 的前沿开发版本(或将此文件复制粘贴到您的安装中),您将获得dump_svmlight_file
比以前快十倍的速度。
编辑:忽略以下答案!实际上,scikit-learn 实现的作者提供了一个基于 Cython 的转储程序。它可以在 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')