矢量化的指标操作这.疏矩阵
-
18-09-2019 - |
题
以下代码运行得太慢,尽管一切都似乎是矢量化。
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]
该问题似乎是,索引编制的操作实现为蟒蛇的功能,并调用 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?有没有人知道的一种方式绕过这种限制,并加快了上述代码?我应该使用不同的稀疏的矩阵型?
解决方案
你可以使用 A.diagonal()
检索的对角线更为迅速(0.0009秒对3.8秒在我的机)。但是,如果你想要做任意的索引,然后,是一个更复杂的问题,因为不使用片这么多作为一个列表中的指数。该_get_single_element功能是被称为100000时间,因为它只是重复通过的迭代(i和j)中,你通过它。一切将是一个[30:60,10]或类似的东西。
此外,我会用 csr_matrix(eye(n,n))
做同一个矩阵,你做的迭代只是简单。
更新:
Ok,由于你的问题真正是对能够访问许多随机的因素很快,我会回答您的问题尽我所能。
- 为什么这不是实现的纯C?
答案是简单的:没有一个已得到解决。仍然有很多工作要做,在稀疏的矩阵模块区域的这从什么我都看到了。一部分,是实现C的转换之间不同的疏矩阵格式。
- 有没有人知道的一种方式绕过这种限制,并加快了上述代码?
你可以尝试实际上潜入疏矩阵模块,并试图加速。我这样做,并能够获得时间缩短到不到三分之一的原始当尝试你的代码以上的随机访问使用企业社会责任的矩阵。我不得不直接访问_get_single_element和削减的代码显着要做,包括把出结检查。
然而,它更快的仍然使用lil_matrix(虽然速度较慢来初始化的矩阵),但我不得不这样做,访问与一个名单的理解,因为律矩阵不是设置这种类型的索引你正在做的事情。使用一个名单的理解为csr_matrix仍律矩阵方法的方式前进的方式。最后,律矩阵快访问的随机因素,因为它不是压缩。
使用lil_matrix在其原始形式运行,约有五分之一的时间代码你有列出上述。如果我拿出一些结检查,并呼lil_matrix的_get1()方法直接,我可以带来的的时间进一步下降约7%,原来的时间。为了清楚起见,是一个速度-从3.4-3.8秒钟约0.261秒钟。
最后,我想做我自己的功能,直接访问的律矩阵的数据,避免重复功能的电话。时间是关于0.136秒钟。这不是采取利用数据进行排序,这是另一个潜在的优化(特别是如果你访问了很多元素都在同一行)。
如果你想要快于然后你将有自己编写C码疏矩阵的执行情况的可能。
- 我应该使用不同的稀疏的矩阵型?
好了,我建议该小矩阵如果你的目的是要访问一个整体很多因素,但是这一切都取决于你需要做的。你也需要乘以矩阵的实例?只要记住,改变矩阵可以至少有时是(在某些情况下),以相当快的速度所以不排除改变到一个不同的矩阵格式来做到不同的操作。
如果你不需要这样做实际上做任何代数作业上你的矩阵,那么也许你应该只使用一个defaultdict或类似的东西。危险与defaultdicts是,每当一个元件是要求不在字典,它将该项目的对默认和存储,以便可能成问题。
其他提示
我想使用“对象”的默认D型细胞时_get_single_element仅调用。您已经尝试提供一D型细胞,如csr_matrix((data, (i,j)), dtype=int32)