Я попытался профилировать функцию 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?