即使所有内容似乎都已矢量化,以下代码运行速度也很慢。
from numpy import *
from scipy.sparse import *
n = 100000;
i = xrange(n); j = xrange(n);
data = ones(n);
A=csr_matrix((data,(i,j)));
x = A[i,j]
问题似乎是索引操作是作为python函数实现的,调用A[i,j]
结果会产生以下分析输出
500033 function calls in 8.718 CPU seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
100000 7.933 0.000 8.156 0.000 csr.py:265(_get_single_element)
1 0.271 0.271 8.705 8.705 csr.py:177(__getitem__)
(...)
也就是说,python 函数_get_single_element
被调用了 100000 次,这确实是低效的。为什么这不是在纯 C 中实现的?有人知道绕过这个限制并加快上述代码的方法吗?我应该使用不同的稀疏矩阵类型吗?