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

标签 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++ 应用程序 使用了所有内存,我曾预计 C++ 会获胜.感谢您提供任何见解。

编辑

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

如果行数是 8192,下面是计时: C++:4.5 秒 python :4.2 秒 Matlab:1.8 秒

最佳答案

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

18 秒足以从基于定时器中断的标准操作系统功能中获得可接受的精度。

您在 OpenCV 中使用什么 BLAS? MatLab 安装了一些高度优化的,IIRC 甚至检测您的 CPU 并适当加载 Intel 或 AMD 的数学库。

关于c++ - 矩阵乘法运行时间 Python < C++ < Matlab - 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051545/

相关文章:

c++ - std::sort 得到一个 std::bad_alloc

python - 如何使用 python 生成 0 和 1 组合的 PBM

python - 如何将 4 字节 IEEE(小端)float 二进制表示转换为 float

matlab - 生成子图,然后在 MATLAB 中将它们组合成一个图形

c++ - 是否有基于范围的类案例控制结构

c++ - 使用模板学习 C++

c++ - Boost 库中的编译失败(program_options)

python - 确保角度小于 360 度的简单循环 [Python]

Matlab 轴在非交互模式下调整大小行为异常

matlab - 条形图上的误差线