0

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 秒

4

1 に答える 1

3

どのCPUで実行していますか?動的クロッキングを備えた最新の x86 および x64 チップの場合、getTickCount信頼getTickFrequencyできません。

18 秒は、タイマー割り込みに基づく標準 OS 機能から許容可能な精度を得るのに十分な長さです。

また、OpenCV で使用している BLAS は何ですか? MatLab はいくつかの高度に最適化されたものをインストールし、IIRC は CPU を検出し、Intel または AMD の数学ライブラリを適切にロードします。

于 2011-02-19T16:11:02.320 に答える