2013-07-09 2 views
19

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

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 website сравнения 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. Нужно ли мне это делать?

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

+0

Christoph Gohlke предоставляет предварительно скомпилированные двоичные файлы Windows для многих пакетов Python, с NumPy, связанным с Intel MKL: http://www.lfd.uci.edu/~gohlke/pythonlibs/ – Amro

+0

Да. Раньше Python был еще медленнее относительно Matlab, поэтому вам повезло. :-) – horchler

+2

Текущее распределение WinPython [уже поставляется с NumPy-MKL] (https://code.google.com/p/winpython/wiki/PackageIndex_33). – Jaime

ответ

51

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

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

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

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

Я действительно не знаю, что происходит на решателе Гаусса Сайдела, но некоторое время назад я написал ответ на вопрос под названием Numpy running at half the speed of MATLAB, в котором немного говорится о MKL, FFT и JIT Matlab.

+0

Я только заметил, что это было ниспровергнуто (это для меня первое). Любые комментарии о том, как улучшить ответ? – jorgeca

+0

Хорошо, я попробовал ваше предложение, используя разную конструкцию массива, и это также привело к ускорению ~ 5x в Numpy, что здорово. Я попробовал это предложение с моим решателем Гаусса-Сейделя и не предложил никаких улучшений, предполагая, что есть еще одна проблема. Я не использую каких-либо причудливых функций или чего-либо в этом решателе, это довольно простой цикл с примерно 16 строками векторизованных назначений и пару контрольных операторов. То, что вы написали в старой теме, также мне не помогает. Есть ли способ отправить вам мой код для проверки или, может быть, задать его в новом вопросе? – nicholls

+0

Поскольку проблема, похоже, различна, вы можете, конечно, задать другой вопрос, чтобы больше людей могли извлечь из этого выгоду! – jorgeca

3

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

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

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

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

Кроме того, вы можете найти this link полезным.

+0

Я сначала попытался сравнить с исследованием НАСА, однако я просил в основном посмотреть, есть ли что-то, что я мог бы сделать (или что-то очевидное), что может привести к тому, что Numpy будет в два раза медленнее. Если бы ответ заключался в том, что версия MATLAB, которую я использовал, была только быстрее, тогда это все, что мне было нужно. Спасибо хоть. – nicholls

Смежные вопросы