gpt4 book ai didi

python - scipy.weave.inline 的性能

转载 作者:行者123 更新时间:2023-11-28 20:52:01 25 4
gpt4 key购买 nike

我是一名 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% 使用一个核心。 Numpy.dot 提供了 10.0 GFlops,而我的笔记本电脑的理论值为 11.6 GFlops( double )。在单精度中,我按预期测量了双重性能。但是 scipy.weave.inline 远远落后了。 scipy.weave.inline 性能的 1/50。

这种差异是意料之中的吗?或者我做错了什么?

最佳答案

您实现了一个朴素的矩阵乘法算法,scipy.weave 可将其编译为快速机器代码。

但是,有一些非显而易见的、更高效的 CPU 缓存 algorithms for matrix multiplication (通常将矩阵分成 block 并处理它们),并且可以通过特定于 CPU 的优化获得额外的速度。 Numpy 默认情况下使用优化的 BLAS 库来执行此操作(如果您已安装)。与您无需进行大量研究即可自行编写代码的任何内容相比,这些库的速度可能会更快。

关于python - scipy.weave.inline 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com