如何加速Python中的数学运算?

时间:2016-08-18 04:24:20

标签: python performance numpy

我正在用Python编写代码,我在巨大的矩阵上进行了大量的矩阵乘法。对于性能以及我使用numpy.einsum的速度。无论如何,einum被很好地优化了,我的代码运行得非常慢。这是我正在寻找加速它的解决方案的原因。我认为PyCuda可能会有所帮助,但在对互联网进行一些研究之后,我发现我错了。 您是否有任何提示如何提高数学运算Python的性能?

例如,我有一堆这样的后续乘法:

NewMatrix_krls = np.einsum('kK,krls->Krls', C, Matrx_krls)

其中C是矩阵1000乘1000,Matrx_krls是1000乘1000乘1000乘1000。

2 个答案:

答案 0 :(得分:0)

einsum构造一个迭代器(ndinter),它在问题空间上循环(在C中)。使用表达式中的维度和索引,空间为1000**5(5个变量,每个变量大小为1000)。这是10**15次操作。

如果问题涉及3个或4个数组的增加,您可以通过将其分成几个einsum个调用(或einsumdot的混合)来加快速度。但是,您的描述中没有足够的信息来表明这种分区。

实际上,您可以使用np.dot的形式投射此内容。 Matrx_krls可以重新整形为二维数组,将rls维度合并为一个1000**3

E.g。 (未经测试)

np.dot(C.T, Matrx_krls.reshape(1000,-1))

对于2个2d数组的产品,np.doteinsum快。

(注意我将您的代码更改为包含numpy - 这会引起更多知识渊博的海报的注意。)

答案 1 :(得分:0)

  

'Matrx_krls是1000乘1000乘1000乘1000'

这就是一个4TB的阵列,假设有4个字节的浮点数...我认为你最好在Hadoop上投入时间而不是GPGPU。即使您将数据流式传输到GPU,由于PCIE带宽有限,您也几乎看不到任何好处。

那,或者解释为什么你认为你需要这种操作可能会有助于更高层次。