Numpy EIG大约比Mac OS X 10.6上的MATLAB EIG慢4倍.我做错了什么



我尝试在MATLAB和NumPy上分析EIG函数,以比较我的Macbook Pro(2 GHz,运行OS X 10.6的四核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]

这大约是NumPy中的19.5秒/exec。

以下是MATLAB中的相同代码:

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

这大约是MATLAB上的5.36秒/exec。

我想像这样简单的事情应该不太依赖于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)]

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

因此,我向NumPy的人提出以下问题:为什么NumPy在这种情况下速度较慢?在安装NumPy时,我是否遗漏了一些优化?

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

import mkl 
mkl.set_num_threads(4) 

如果我没有看错,那么除了eig函数之外,您还将分析随机数生成器的性能。几年前,我曾犯过一个错误,将GAUSS与MATLAB进行比较——我会重新考虑随机数的生成,看看你会得到什么。

另一个注意事项是,对于一些LAPACK/BLAS的东西,如果你确保你的numpy数组在内部以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

-Chris

巨大的区别在于,在MATLAB中,您只计算特征值,而在python/numpy中,您同时计算特征值和特征向量。要更正此问题并进行适当的比较,您必须执行以下操作之一:1.将numpy.linalg.eig(x)更改为numpy.lanalg.eigvals(x),保留matlab代码为OR2.在matlab中将eig(x)更改为[V,D]=eig(x),保留python/numpy代码(这可能会导致matlab脚本消耗更多内存)根据我的经验,使用MKL优化的python/numpy(我使用windows;对acclerate框架不太了解)与使用MKL进行优化的matlab一样快或略快。

最新更新