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

0 投票
1 回答
1952 浏览
提问于 2025-04-16 12:07

我有一个矩阵 M,它的大小是 16384 x 81。我想计算 M * M.t(结果会是 16384x16384)。

我想问的是:能不能有人解释一下运行时间的差异

使用 OpenCV 在 C++ 中,下面的代码花了 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++ 应用程序 使用了所有的内存,我原本以为 C++ 会表现得更好。感谢任何见解。

编辑

在重新调整我的示例,只计时操作后,Python 的代码现在也花了 18 秒。我真的不确定发生了什么,但如果内存足够的话,现在它们似乎都表现得差不多。

如果行数是 8192,以下是各个语言的运行时间: C++: 4.5 秒 Python: 4.2 秒 Matlab: 1.8 秒

1 个回答

3

你现在用的是什么CPU?对于现代的x86和x64芯片,它们有动态调节时钟速度的功能,所以getTickCountgetTickFrequency这两个函数的结果不太可靠。

18秒的时间足够让标准操作系统的函数通过定时器中断获得比较准确的结果。

你在使用OpenCV的时候用的是哪个BLAS?记得MatLab会安装一些经过高度优化的BLAS,它甚至会检测你的CPU,然后相应地加载Intel或AMD的数学库。

撰写回答