MATLAB в два раза быстрее, чем Numpy

Я студент инженерного градиента, который в настоящее время делает переход от MATLAB к Python для целей численного моделирования. У меня создалось впечатление, что для базового манипулирования массивом Numpy будет работать так же быстро, как MATLAB. Тем не менее, он появляется для двух разных программ, которые я пишу, что MATLAB немного меньше, чем у Numpy. Код проверки, который я использую для Numpy (Python 3.3):

import numpy as np
import time

a = np.random.rand(5000,5000,3)

tic = time.time()
a[:,:,0] = a[:,:,1]
a[:,:,2] = a[:,:,0]
a[:,:,1] = a[:,:,2]
toc = time.time() - tic
print(toc)

В то время как для MATLAB 2012a я использую:

a = rand(5000,5000,3);

tic;
a(:,:,1) = a(:,:,2);
a(:,:,3) = a(:,:,1);
a(:,:,2) = a(:,:,3);
toc

Используемый мной алгоритм - это тот, который используется на веб-сайте NASA сравнивая Numpy и MATLAB. На веб-сайте показано, что Numpy превосходит MATLAB с точки зрения скорости для этого алгоритма. Тем не менее мои результаты показывают время моделирования 0,49 с для Numpy и время моделирования 0,29 с для MATLAB. Я также запустил решение Gauss-Seidel как на Numpy, так и на Matlab, и получаю аналогичные результаты (16,5 с против 9,5 с).

Я новичок в Python и не очень грамотен в плане программирования. Я использую 64-разрядный дистрибутив Python для WinPython, но также попробовал Pythonxy безрезультатно.

Одна вещь, которую я прочитал, которая должна повысить производительность, - это создание Numpy с использованием MKL. К сожалению, я не знаю, как это сделать в Windows. Нужно ли мне это делать?

Любые предложения?

Ответы

Ответ 1

Это сравнение заканчивается тем, что яблоки используются для апельсинов из-за кеширования, потому что более эффективно передавать или выполнять некоторую работу над смежными кусками памяти. Этот конкретный ориентир связан с памятью, поскольку на самом деле вычисления не выполняются, и, следовательно, процент обращений в кеш является ключевым для достижения хорошей производительности.

Matlab хранит данные в основном порядке столбца (порядок Fortran), поэтому a(:,:,k) - это непрерывный фрагмент памяти, который быстро копируется.

По умолчанию Numpy используется порядок строк (порядок C), поэтому в a[:,:,k] происходят большие переходы между элементами, что замедляет передачу памяти. Фактически, можно выбрать формат данных. В моем ноутбуке создание массива с a = np.asfortranarray(np.random.rand(5000,5000,3)) привело к 5-кратной скорости (1 с против 0,19 с).

Этот результат должен быть очень похож как на numpy-MKL, так и на простой numpy, потому что MKL - это быстрая реализация LAPACK, и здесь вы не вызываете какую-либо функцию, которая ее использует (MKL определенно помогает при решении линейных систем, вычислений точечных продуктов..).

Я не знаю, что происходит на решателе Гаусса Сайдела, но некоторое время назад я написал ответ на вопрос под названием Numpy, работающий на половине скорости MATLAB, который немного говорит о MKL, FFT и Matlab JIT.

Ответ 2

Вы пытаетесь воссоздать эксперимент NASA, однако вы изменили многие переменные. Например:

  • Ваше оборудование и операционная система отличаются (www.nccs.nasa.gov/dali_front.html)
  • Ваша версия Python отличается (2.5.3 против 3.3)
  • Ваша версия MATLAB отличается (2008 против 2012)

Предполагая, что результаты НАСА верны, разница в результатах связана с одной или несколькими из этих измененных переменных. Я рекомендую вам:

  • Повторите попытку с помощью предварительно созданных файлов .
  • Исследование, если какие-либо улучшения были сделаны в MATLAB относительно этого типа вычислений.

Кроме того, вы можете найти эту ссылку.