矩阵乘法运行时间Python< C ++< Matlab - 解释

时间:2011-02-19 15:08:44

标签: c++ python matlab opencv matrix-multiplication

我有一个M矩阵16384 x 81。我想计算M * M.t(结果将是16384x16384)。

我的问题是:有人可以解释一下运行时差异吗?

在C ++中使用 OpenCV ,以下代码需要 18秒

#include <cv.h>
#include <cstdio>
using namespace cv;
int main(void) {
  Mat m(16384, 81, CV_32FC1);
  randu(m, Scalar(0), Scalar(1));
  int64 tic = getTickCount();
  Mat m2 = m * m.t();
  printf("%f", (getTickCount() - tic) / getTickFrequency());
}

Python 中,以下代码 0.9秒 18.8秒(请参阅下面的评论)

import numpy as np
from time import time
m = np.random.rand(16384, 81)
tic = time()
result = np.dot(m, m.T)
print (time() - tic)

MATLAB 中,以下代码需要 17.7秒

m = rand(16384, 81); 
tic;
result = m * m';
toc;

我唯一的猜测是它是一个内存问题,并且Python能够以某种方式避免交换空间。但是,当我观看top时,我看不到我的C++ application使用了所有内存,我原本预计C++会赢得这一天。感谢您的任何见解。

修改

在修改我的示例以仅对该操作进行计时之后,现在使用Python也需要18秒的代码。我真的不确定发生了什么,但是如果有足够的内存,它们现在似乎都表现相同。

以下是行数为8192的时间: C ++:4.5秒 Python:4.2秒 Matlab:1.8秒

1 个答案:

答案 0 :(得分:3)

你在运行什么CPU?对于具有动态时钟的现代x86和x64芯片,getTickCountgetTickFrequency不可信任。

18秒足够长,可以根据定时器中断从标准OS功能中获得可接受的精度。

你在OpenCV上使用什么BLAS? MatLab安装了一些高度优化的产品,IIRC甚至可以检测你的CPU并适当加载英特尔或AMD的数学库。