我是一名Python新手,正在尝试学习这种奇妙的编程语言。我已经尝试使用scipy.weave.inline来加速一些计算。只是为了学习一点,我尝试使用scipy.weave.inline实现矩阵乘法。我没有包含任何错误处理 - 只是尝试更好地理解它。代码如下:
import scipy.weave
def cmatmul(A,B):
R = numpy.zeros((A.shape[0],B.shape[1]))
M = R.shape[0]
N = R.shape[1]
K = A.shape[1]
code = \
"""
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
for (int k=0; k<K; k++)
R(i,j) += A(i,k) * B(k,j);
"""
scipy.weave.inline(code, ['R','A','B','M','N','K'], \
type_converters=scipy.weave.converters.blitz, \
compiler='gcc')
return R
当我与numpy.dot比较时,我发现weave.inline版本的时间大约是numpy.dot的50倍。我知道,当它可以应用时,numpy非常快。对于大型矩阵,例如1000 x 1000大小,甚至可以看到差异。
我检查了numpy.dot和scipy.weave.inline,两者在计算时似乎都使用了一个100%的核心。与我的笔记本电脑的理论11.6 GFlops(双精度)相比,Numpy.dot提供10.0 GFlops。在单精度中,我按预期测量双重性能。但scipy.weave.inline落后了。 scipy.weave.inline的这个性能的1/50倍。
预计会出现这种差异吗?或者我做错了什么?
答案 0 :(得分:7)
你实现了一个天真的矩阵乘法算法,scipy.weave
编译成快速的机器代码。
但是,有一些非显而易见的,更高效的CPU缓存algorithms for matrix multiplication(通常将矩阵分成块并处理它们),并且可以通过CPU特定的优化获得额外的速度。如果安装了Numpy,默认情况下Numpy会为此操作使用优化的BLAS库。与没有进行大量研究的自己编码的任何东西相比,这些库可能会很快。