NumPy/Python与Matlab的性能比较

4
我有一个简单的 python(numpy)矩阵乘法代码。
import numpy as np
import time
a = np.random.random((70000,3000));
b = np.random.random((3000,100));
t1=time.time()
c = np.dot(a,b);
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1

在单个核上完成乘法(c = np.dot(a,b);)需要约16秒的时间。然而,当我在Matlab上运行相同的乘法时,它只需要约1秒钟(6个核心)就能完成乘法。

那么,为什么Matlab对于矩阵乘法比numpy快2.6倍呢?(对于我来说,每个核心的性能很重要)

更新:我这次尝试使用Eigen做同样的事情。它的表现略优于Matlab。Eigen使用与Numpy相同的Blas实现,因此Blas实现可能不是性能不足的源头。

为了确保安装的numpy使用了BLAS,我使用np.show_config()。

enter code here
blas_info:
   libraries = ['blas']
   library_dirs = ['/usr/lib64']
   language = f77
lapack_info:
   libraries = ['lapack']
   library_dirs = ['/usr/lib64']
   language = f77

atlas_threads_info:
   NOT AVAILABLE

blas_opt_info:
   libraries = ['blas']
   library_dirs = ['/usr/lib64']
   language = f77
   define_macros = [('NO_ATLAS_INFO', 1)]

atlas_blas_threads_info:
   NOT AVAILABLE

lapack_opt_info:
   libraries = ['lapack', 'blas']
   library_dirs = ['/usr/lib64']
   language = f77
   define_macros = [('NO_ATLAS_INFO', 1)]

atlas_info:
   NOT AVAILABLE

lapack_mkl_info:
   NOT AVAILABLE

blas_mkl_info:
   NOT AVAILABLE

atlas_blas_info:
   NOT AVAILABLE

mkl_info:
   NOT AVAILABLE

你是如何安装Numpy的?也许是通过Ubuntu软件包安装的吗? - Fred Foo
2
那个 blas 是来自 netlib 的参考 blas - 最慢的 blas。请安装 atlas 或 mkl 替代。 - Anycorn
是的,我使用了__sudo apt-get install python-numpy__。 - iampat
1
@iampat:这被认为是Numpy的一个非常次优的构建。在安装更好的BLAS库之后自己编译它,或者使用EPD - Fred Foo
这次我尝试使用Eigen做了同样的事情,它的性能比Matlab略好。Eigen使用与Numpy相同的Blas实现,因此Blas实现不可能是性能不佳的原因。 - iampat
1
@iampat - 你确定Eigen链接到了相同的BLAS实现吗?例如,在我的机器上,链接到netlib的BLAS的repo版本的numpy需要约50秒。使用链接到MKL的BLAS实现的EPD,计算只需要0.7秒。唯一的区别就是BLAS实现。 - Joe Kington
1个回答

6

1
谢谢您的回答。我不能更改我的Python发行版,但我可以更改BLAS实现。 - iampat
这次我尝试使用Eigen做了同样的事情,它的性能比Matlab略好。Eigen使用与Numpy相同的Blas实现,因此Blas实现不可能是性能不佳的原因。 - iampat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接