python还是c++处理大型矩阵_矩阵乘法的Python、NoMPY、NUMBA和C++比较

在我正在做的一个程序中,我需要重复乘以两个矩阵。由于其中一个矩阵的大小,这个操作需要一些时间,我想看看哪种方法最有效。矩阵有(m x n)*(n x p)维,其中m = n = 3和{}。在

除了Numpy(我假设它可以使用优化算法)之外,每个测试都包含一个matrix multiplication的简单实现:

Rw8TH.png

以下是我的各种实现:

Pythondef dot_py(A,B):

m, n = A.shape

p = B.shape[1]

C = np.zeros((m,p))

for i in range(0,m):

for j in range(0,p):

for k in range(0,n):

C[i,j] += A[i,k]*B[k,j]

return C

数字

^{pr2}$

a

代码与Python代码相同,但它是在使用前及时编译的:dot_nb = nb.jit(nb.float64[:,:](nb.float64[:,:], nb.float64[:,:]), nopython = True)(dot_py)

到目前为止,每个方法调用都使用timeit模块计时10次。保持最佳结果。矩阵是使用np.random.rand(n,m)创建的。在

C++ >强>mat2 dot(const mat2& m1, const mat2& m2)

{

int m = m1.rows_;

int n = m1.cols_;

int p = m2.cols_;

mat2 m3(m,p);

for (int row = 0; row < m; row++) {

for (int col = 0; col < p; col++) {

for (int k = 0; k < n; k++) {

m3.data_[p*row + col] += m1.data_[n*row + k]*m2.data_[p*k + col];

}

}

}

return m3;

}

这里,mat2是我定义的一个自定义类,dot(const mat2& m1, const mat2& m2)是这个类的一个朋友函数。它使用QPF和QPC从Windows.h开始计时,并使用MinGW和g++命令编译程序。同样,从10次执行中获得的最佳时间保持不变。在

结果

V68IK.png

正如预期的那样,简单的Python代码速度较慢,但对于非常小的矩阵,它仍然优于Numpy。结果比最大的案子快30%。在

我对C++结果感到惊讶,其中乘法比NUBA的时间要多出一个数量级。事实上,我预计这些花费的时间也差不多。在<>这导致了我的主要问题:这是正常的,如果不是,为什么C++比NUBA慢?我刚开始学习C++,所以我可能做了一些错误的事情。如果是这样,我会犯什么错误,或者我可以做些什么来提高代码的效率(除了选择更好的算法之外)?在

编辑1

这是mat2类的头。在#ifndef MAT2_H

#define MAT2_H

#include

class mat2

{

private:

int rows_, cols_;

float* data_;

public:

mat2() {} // (default) constructor

mat2(int rows, int cols, float value = 0); // constructor

mat2(const mat2& other); // copy constructor

~mat2(); // destructor

// Operators

mat2& operator=(mat2 other); // assignment operator

float operator()(int row, int col) const;

float& operator() (int row, int col);

mat2 operator*(const mat2& other);

// Operations

friend mat2 dot(const mat2& m1, const mat2& m2);

// Other

friend void swap(mat2& first, mat2& second);

friend std::ostream& operator<<(std::ostream& os, const mat2& M);

};

#endif

编辑2

正如许多人建议的那样,使用优化标志是匹配Numba所缺少的元素。以下是与先前曲线相比的新曲线。通过切换两个内环得到标记为v2的曲线,并显示出另外30%到50%的改进。在

hNpgz.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值