Скорость умножения матриц с Octave

Мне было любопытно, насколько быстро происходит умножение матриц в Octave 3.8.2, поэтому я использовал следующий код для расчета времени умножения двух матриц 5000X5000:

X = rand(5000,5000);
Y = rand(5000,5000);
BEFORE = time();
Z = X*Y;
AFTER = time();
disp(AFTER - BEFORE);

Результат в среднем около 1 минуты. Используя почти идентичный код, я сделал те же вычисления в Python с матрицами numpy. Это заняло около 7,5 с.

Я был удивлен этими результатами, потому что у меня сложилось впечатление, что Octave сильно оптимизирован для матричных вычислений. Мои результаты типичны? Когда дело доходит до крупномасштабных матричных вычислений, люди обычно предпочитают Python, а не Octave?

РЕДАКТИРОВАТЬ: Вот код numpy...

X = numpy.matrix(numpy.random.rand(5000,5000))
Y = numpy.matrix(numpy.random.rand(5000,5000))
BEFORE = time.process_time()
Z = X*Y;
AFTER = time.process_time()
print(AFTER - BEFORE)

person Ari Herman    schedule 13.09.2015    source источник
comment
Покажите нам свой код numpy. Без него невозможно сказать, почему существует огромная разница во времени.   -  person rayryeng    schedule 14.09.2015
comment
Кстати, я запустил этот код в MATLAB, и он выполняется за 3,32 секунды. Я использовал tic/toc. Моя конфигурация — MATLAB R2013a в Mac OS 10.10.5 с 16 ГБ ОЗУ.   -  person rayryeng    schedule 14.09.2015
comment
Также зависит от того, какой компилятор вы использовали для компиляции NumPy (это код C и Fortran под капотом) и какой компилятор вы использовали для своего blas/lapack/atlas.   -  person    schedule 14.09.2015
comment
Я считаю, что использую Cython. Я только что скачал Anaconda3, поэтому использую все, что с ним связано.   -  person Ari Herman    schedule 14.09.2015
comment
octave-3.6.4.exe:1>x = rand(5000, 5000); octave-3.6.4.exe:2>y = rand(5000, 5000); octave-3.6.4.exe:3> до = время(); octave-3.6.4.exe:4> z = x*y; octave-3.6.4.exe:5› после = время(); octave-3.6.4.exe:6› disp(после-до); 16.258 октава-3.6.4.exe:7›   -  person duffymo    schedule 14.09.2015
comment
16,258 секунды для меня. Работает под управлением 64-разрядной версии Windows 7 на процессоре AMD с тактовой частотой 3 ГГц, 6 ядер и 8 ГБ ОЗУ.   -  person duffymo    schedule 14.09.2015
comment
Таким образом, он работал примерно в 2 раза медленнее, чем мой код Python, и в 4 раза быстрее, чем мой код Octave. Я использую Windows 10 64-битный Intel i7-5500U 2,4 ГГц 4 ядра с 8 ГБ ОЗУ.   -  person Ari Herman    schedule 14.09.2015
comment
@rayryeng Я совершенно уверен, что это неправильно. Я попытался использовать оператор * с двумя небольшими матрицами numpy, и он выполнил умножение матриц, как и ожидалось. Я думаю, вы можете путать матрицы numpy с массивами numpy.   -  person Ari Herman    schedule 14.09.2015
comment
@AriHerman - Вы правы. Мои извинения. Я прочитал это как массивы numpy, а не матрицы..... что подводит меня к другому вопросу. Вы пытались использовать массивы numpy и использовать numpy.dot?   -  person rayryeng    schedule 14.09.2015
comment
@rayryeng Используя массивы numpy и numpy.dot, вычисление заняло 8,5 с. Немного медленнее, чем использование пустых матриц.   -  person Ari Herman    schedule 14.09.2015
comment
@AriHerman - Интересно. Я удивлен, почему Octave уделил вам минуту ... тем более, что MATLAB и Octave используют BLAS под капотом.   -  person rayryeng    schedule 14.09.2015
comment
С октавой, упакованной в Ubuntu 14.04 LTS, на машине с восьмиядерным процессором i7-4800MQ @ 2,70 ГГц (и достаточным количеством оперативной памяти) требуется ~ 17 секунд. С python он использует уникальное ядро ​​(поведение по умолчанию), и это заняло более пяти минут...   -  person xiawi    schedule 14.09.2015


Ответы (1)


Я не могу воспроизвести такие плохие результаты

timesum = 0
maxtime = 0
mintime = 100
for n = 1:100
  x = rand(5000,5000);
  y = rand(5000,5000);
  tic
  Z = x*y;
  tmptime = toc;
  timesum += tmptime;
  maxtime = max(maxtime, tmptime);
  mintime = min(mintime, tmptime);  
end
disp("meantime")
disp(timesum/100)
disp("maxtime")
disp(maxtime)
disp("mintime")
disp(mintime)


octave:1> test1
timesum =                    0
maxtime =                    0
mintime =                  100
meantime
    4.34704959154129
maxtime
      5.297199010849
mintime
    4.09799385070801
octave:2> 

Octave 4.0.0 на Haswell i5 Mobile.

Результат с Matlab почти такой же

meantime
    4.0443

maxtime
    5.5522

mintime
    3.9679

Это не удивительно. Они используют более или менее одни и те же библиотеки.

person Markus    schedule 22.09.2015