更新Ubuntu至13.10后,Python Numpy.dot运行速度慢20倍

11 投票
1 回答
1742 浏览
提问于 2025-04-27 12:29

正如标题所说,numpy.dot(我觉得numpy整体上都是)在我更新系统后变得非常慢。我用来比较的示例代码是:

from numpy import *
import time
A=random.random((1000,1000))
B=random.random((1000,1000))
st=time.time();dot(A,B);end=time.time();print end-st

这段代码在我另一台电脑上大约需要0.09秒(有问题的电脑以前运行速度和另一台一样快),但在有问题的电脑上,这段代码却需要大约0.26秒。

以下是我尝试解决这个问题的方法。我的第一个猜测是,

  1. ATLAS没有和numpy连接。

所以,我通过synaptic安装了atlas相关的包,包括libatlas3-bas、libatlas-doc、libatlas-dev、libatlas3gf-bas和libatlas-bas-dev。

安装完这些后,我检查numpy是否链接到了atlas,输入了:

import numpy.distutils.system_info as sysinfo
sysinfo.get_into('atlas')

返回的信息是:

ATLAS version 3.10.1 built by buildd on Sat Jul 27 19:04:50 UTC 2013:
   UNAME    : Linux roseapple 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

   INSTFLG  : -1 0 -a 1 -l 1
   ARCHDEFS : -DATL_OS_Linux -DATL_ARCH_x86SSE2 -DATL_CPUMHZ=1596 -DATL_SSE2 -DATL_SSE1 -DATL_USE64BITS -DATL_GAS_x8664
   F2CDEFS  : -DAdd_ -DF77_INTEGER=int -DStringSunStyle
   CACHEEDGE: 1048576
   F77      : /usr/bin/x86_64-linux-gnu-gfortran-4.8, version GNU Fortran (Ubuntu/Linaro 4.8.1-8ubuntu1) 4.8.1
   F77FLAGS : -fomit-frame-pointer -mfpmath=sse -O2 -msse2 -fPIC -m64
   SMC      : /usr/bin/c99-gcc, version gcc (Ubuntu/Linaro 4.8.1-8ubuntu1) 4.8.1
   SMCFLAGS : -fomit-frame-pointer -mfpmath=sse -O2 -msse2 -fPIC -m64
   SKC      : /usr/bin/c99-gcc, version gcc (Ubuntu/Linaro 4.8.1-8ubuntu1) 4.8.1
   SKCFLAGS : -fomit-frame-pointer -mfpmath=sse -O2 -msse2 -fPIC -m64
Out[12]: 
{'define_macros': [('ATLAS_INFO', '"\\"3.10.1\\""')],
 'include_dirs': ['/usr/include/atlas'],
 'language': 'f77',
 'libraries': ['lapack', 'f77blas', 'cblas', 'atlas'],
 'library_dirs': ['/usr/lib/atlas-base/atlas', '/usr/lib/atlas-base']}

所以,我认为它是链接上的。我还进入了numpy/core/路径,输入了:

$ldd _dotblas.so 

输出是:

linux-vdso.so.1 =>  (0x00007fff16ffa000)
libcblas.so.3 => /usr/lib/libcblas.so.3 (0x00007fa913908000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa9136eb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa913322000)
libatlas.so.3 => /usr/lib/libatlas.so.3 (0x00007fa912d8f000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007fa912a77000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa912860000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa91255c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa913d4f000)
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fa912320000)

然后,为了确认libcblas.so.3是否链接到ATLAS,我输入了:

$ /usr/sbin/update-alternatives --config libblas.so.3
There are 4 choices for the alternative libblas.so.3 (providing /usr/lib/libblas.so.3).

  Selection    Path                                     Priority   Status
------------------------------------------------------------
  0            /usr/lib/openblas-base/libopenblas.so.0   40        auto mode
* 1            /usr/lib/atlas-base/atlas/libblas.so.3    35        manual mode
  2            /usr/lib/libblas/libblas.so.3             10        manual mode
  3            /usr/lib/openblas-base/libopenblas.so     30        manual mode
  4            /usr/lib/openblas-base/libopenblas.so.0   40        manual mode

Press enter to keep the current choice[*], or type selection number: 1

接下来的步骤没有解决我的问题……

  1. 我发现我的CPU限速功能开启了,而ATLAS在CPU限速开启时表现不佳。所以,我通过rcconf关闭了它,然后像上面那样重新安装了Atlas和Numpy……但问题依然没有解决……

  2. 现在我在运行python 2.7.5+,所以我也尝试重新安装它……但没有解决问题。

  3. 我检查了我的内存……

             total       used       free     shared    buffers     cached
    

    内存: 5959 2345 3614 0 86 730

    -/+ buffers/cache: 1528 4431

    交换区: 6133 0 6133

我的内存是空闲的……而我的matlab代码运行速度和以前一样快……所以我认为这不是内存的问题……

有没有人能帮帮我?看起来numpy的线性代数包很慢……现在,这大大拖延了我的模拟,我真的无法运行我的代码。非常感谢!如果我的问题有任何不清楚的地方,请告诉我!

暂无标签

1 个回答

6

当你说“还重新安装了Numpy”时,你是用的pip还是apt-get/synaptic呢?

通过 apt-get install python-numpy 安装的NumPy是已经编译好的版本,适合Ubuntu或Debian系统。另一方面,使用 pip install numpy 或在NumPy源代码目录下运行 python setup.py 来安装NumPy,则是利用你电脑上的编译器从源代码编译NumPy。

你可能会想在自己电脑上使用ATLAS来编译NumPy。ATLAS会根据你电脑的特点来优化NumPy库(这实际上需要关闭CPU的节能模式)。

apt-get install -y python-pip python-dev build-essential
pip install -U cython

apt-get install -y gcc gfortran libatlas-base-dev liblapack-dev
pip install numpy

你可以查看 ATLAS安装指南 或者 在Linux上从源代码构建NumPy和SciPy的说明

这可能是你已经做过的,但也许其他人会觉得有用!

撰写回答