Время выполнения умножения матриц Python <C ++ <Matlab - Объяснить - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть матрица 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)

In MATLAB следующий код занимает 17,7 секунд

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

Моим единственным предположением было бы то, что это проблема с памятью и что каким-то образом Python может избежать пространства подкачки.Однако, когда я смотрю top, я не вижу, как C++ application использует всю память, и я ожидал, что C++ выиграет день.Спасибо за любые идеи.

Редактировать

После пересмотра моих примеров для определения времени только операции, код теперь также занимает 18 секунд с Python.Я действительно не уверен, что происходит, но если памяти достаточно, все они, похоже, теперь работают одинаково.

Вот время, если число строк равно 8192: C ++: 4,5 секунды Python: 4,2 секундыMatlab: 1,8 секунды

1 Ответ

3 голосов
/ 19 февраля 2011

На каком процессоре вы работаете?Для современных чипов x86 и x64 с динамическим тактированием нельзя доверять getTickCount и getTickFrequency.

18 секунд достаточно для получения приемлемой точности стандартных функций ОС на основе прерывания по таймеру.

А какой BLAS вы используете с OpenCV?MatLab устанавливает несколько высокооптимизированных, IIRC даже определяет ваш процессор и загружает математическую библиотеку Intel или AMD соответствующим образом.

...