我试着在MATLAB和NumPy上分析EIG函数,比较我的Macbook (2 GHz,运行OSX10.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]
这大约是19.5秒/ NumPy中的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上使用加速框架。
NumPy还在我的Macbook上使用了加速框架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)]
我使用Python2.7.2和NumPy 1.6 (都是从MacPorts安装的)
下面是我对NumPy人员的一个问题:为什么NumPy在这种情况下会变慢?我是否在安装NumPy时遗漏了一些优化?
发布于 2012-04-01 17:16:27
据我所知,MATLAB使用MKL库作为BLAS,而不是加速框架。我的经验告诉我,这种加速比MKL慢得多。要检查它,您可以尝试获得(环保署)的学术版本,其中Numpy是针对MKL编译的,并比较这些时间。此外,在默认情况下,MATLAB使用所有线程(尝试在单线程模式下运行),但Numpy不是。在环保署,它可以通过运行来完成。
import mkl
mkl.set_num_threads(4)
发布于 2012-04-02 03:48:08
如果我读对了,那么除了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
发布于 2012-05-29 17:01:24
最大的区别在于,在MATLAB中,您只计算特征值,而在python/numpy中,则同时计算特征值和特征向量。要纠正这一点并进行适当的比较,您必须执行以下操作之一: 1.将numpy.linalg.eig(x)更改为numpy.linalg.eigvals(x),保留numpy.linalg.eigvals(X),然后保留numpy.linalg.eigvals代码。2.在matlab中将eig(x)更改为V,D= eig(x),留下python/numpy代码(这可能会产生更多的内存被matlab脚本占用)。在我的经验中,用MKL优化的python/numpy (我使用窗口;不知道多少关于计算框架的知识)比使用MKL优化的python/numpy更快或更快。
https://stackoverflow.com/questions/9955021
复制相似问题