在Mac OS X 10.6上,Numpy EIG比MATLAB EIG慢大约4倍.我究竟做错了什么?

Kar*_*Man 3 macos numpy blas accelerate-framework

我尝试在MATLAB和NumPy上分析EIG功能,以比较我的Macbook Pro(2 GHz,运行OS X 10.6的Quad core i7)的性能.与MATLAB相比,NumPy EIG似乎相当慢.

这是我在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]
Run Code Online (Sandbox Code Playgroud)

在NumPy中大约是19.5秒/执行.

这是MATLAB中的相同代码:

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

在MATLAB 上大约是5.36秒/执行.

我想这个简单的东西不应该在很大程度上取决于JIT的性能,所以它可能归结为BLAS和访问BLAS库的例程.我知道MATLAB在Mac上使用Accelerate Framework.

NumPy似乎也在我的Macbook Pro上使用Accelerate Framework BLAS; 这是输出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)]
Run Code Online (Sandbox Code Playgroud)

我使用的是Python 2.7.2和NumPy 1.6(都是从MacPorts安装的)

所以这是我对NumPy人的问题:为什么NumPy在这种情况下会变慢?安装NumPy时是否遗漏了一些优化?

小智 5

据我所知,MATLAB使用MKL库作为BLAS,而不是Accelerate Framework.我的经验告诉我,Accelerate明显慢于MKL.要检查它,您可以尝试获取Enthought Python Distribution(EPD)的学术版本,其中Numpy是针对MKL编译的,并比较这些时间.此外,默认情况下,MATLAB使用所有线程(尝试在单线程模式下运行),但Numpy不是.在EPD中,它可以通过运行来完成

import mkl 
mkl.set_num_threads(4) 
Run Code Online (Sandbox Code Playgroud)