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 относительно этого типа вычислений.
Кроме того, вы можете найти эту ссылку.