Numpy EIG примерно в 4 раза медленнее, чем MATLAB EIG в Mac OS X 10.6.Что я делаю неправильно? - PullRequest
3 голосов
/ 31 марта 2012

Я попытался профилировать функцию EIG на MATLAB и NumPy, чтобы сравнить производительность на моем Macbook Pro (2 ГГц, Quad Core i7 под управлением OS X 10.6). NumPy EIG выглядит довольно медленно по сравнению с MATLAB.

Вот код, который я профилировал на NumPy:

s = '''\
x = numpy.random.random((2000,2000));
numpy.linalg.eig(x);
'''
t = timeit.Timer(stmt=s,setup="import numpy")
result = t.repeat(repeat=5,number=10)
result
Out[22]: 
[197.1737039089203,
 197.34872913360596,
 196.8160741329193,
 197.94081807136536,
 194.5740351676941]

Это примерно 19,5 с / exec в NumPy.

Вот тот же код в MATLAB:

clear all
tic;
for i = 1:50
    x = rand(2000,2000);
    eig(x);
end
toc;
Elapsed time is 267.976645 seconds.

Это около 5,36 с / exec на MATLAB.

Полагаю, что что-то простое, так как это не должно сильно зависеть от производительности JIT, поэтому, вероятно, все сводится к BLAS и подпрограммам, которые обращаются к библиотекам BLAS. Я знаю, что MATLAB использует Accelerate Framework на Mac.

NumPy также использует Accelerate Framework BLAS на моем Macbook Pro; вот вывод numpy.show_config()

numpy.show_config()
lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]

Я использую Python 2.7.2 и NumPy 1.6 (оба установлены из MacPorts)

Итак, вот мой вопрос к людям NumPy: Почему NumPy медленнее в этом случае? Я пропустил некоторые оптимизации при установке NumPy?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2012

Насколько я знаю, MATLAB использует библиотеки MKL в качестве BLAS, а не Accelerate Framework.Мой опыт говорит мне, что ускорение значительно медленнее, чем MKL.Чтобы проверить это, вы можете попытаться получить академическую версию Enthought Python Distribution (EPD), где Numpy скомпилирован с MKL, и сравнить эти временные параметры.Более того, по умолчанию MATLAB использует все потоки (попробуйте запустить в однопоточном режиме), а Numpy - нет.В EPD это можно сделать с помощью команды

import mkl 
mkl.set_num_threads(4) 
2 голосов
/ 02 апреля 2012

Если я правильно понял, вы профилируете производительность генератора случайных чисел в дополнение к функции eig. Я сделал эту ошибку, как только годы шли на сравнение GAUSS с MATLAB - я бы заново учел факторизацию генерации случайных чисел, чтобы увидеть, что вы получите.

еще одно примечание - для некоторых вещей LAPACK / BLAS вы можете получить лучшую производительность, если убедитесь, что ваши пустые массивы хранятся внутри в порядке Fortran:

In [12]: x = numpy.random.random((200,200))

In [13]: x.flags
Out[13]: 
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False


In [15]: x = numpy.array(x, order="F")

In [16]: x.flags
Out[16]: 
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

-Крис

1 голос
/ 29 мая 2012

Огромная разница в том, что в MATLAB вы вычисляете только собственные значения, а в python / numpy вы рассчитываете как собственные значения, так и собственные векторы. Чтобы исправить это и сделать соответствующие сравнения, вы должны выполнить одно из следующих действий: 1. замените numpy.linalg.eig (x) на numpy.linalg.eigvals (x), оставьте код Matlab как ИЛИ 2. измените eig (x) на [V, D] = eig (x) в matlab, оставьте код python / numpy как есть (это может создать больше памяти, используемой сценарием matlab) по моему опыту, python / numpy, оптимизированный с помощью MKL (я использую windows; не очень разбираюсь в ускоренной среде), работает так же быстро или немного быстрее, чем matlab, оптимизированный с помощью MKL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...