首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Numpy EIG大约比MacOSX10.6上的MATLAB EIG慢4倍。我做错了什么?

Numpy EIG大约比MacOSX10.6上的MATLAB EIG慢4倍。我做错了什么?
EN

Stack Overflow用户
提问于 2012-03-31 10:16:47
回答 3查看 1.5K关注 0票数 3

我试着在MATLAB和NumPy上分析EIG函数,比较我的Macbook (2 GHz,运行OSX10.6的四核i7 )的性能。与MATLAB相比,NumPy的EIG显得相当慢。

下面是我在NumPy上分析的代码:

代码语言:javascript
运行
复制
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中的相同代码:

代码语言:javascript
运行
复制
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()的输出

代码语言:javascript
运行
复制
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时遗漏了一些优化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-01 17:16:27

据我所知,MATLAB使用MKL库作为BLAS,而不是加速框架。我的经验告诉我,这种加速比MKL慢得多。要检查它,您可以尝试获得(环保署)的学术版本,其中Numpy是针对MKL编译的,并比较这些时间。此外,在默认情况下,MATLAB使用所有线程(尝试在单线程模式下运行),但Numpy不是。在环保署,它可以通过运行来完成。

代码语言:javascript
运行
复制
import mkl 
mkl.set_num_threads(4) 
票数 5
EN

Stack Overflow用户

发布于 2012-04-02 03:48:08

如果我读对了,那么除了eig函数之外,您还将分析随机数生成器的性能。我曾经犯过这样的错误:把GAUSS和MATLAB进行比较--我会重新考虑随机数的产生,看看你得到了什么。

另一个注意事项--对于LAPACK/BLAS中的某些内容,如果确保numpy数组在内部按Fortran顺序存储,则可以提高性能:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 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更快或更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9955021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档