正如标题所示,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.09s(问题的计算机运行速度与另一台计算机一样快),但代码在计算机上需要大约0.26的问题。
以下是我尝试解决此问题的方法。 我的第一个猜测是, 1:ATLAS没有连接到numpy。 所以,我使用synaptic,libatlas3-bas,libatlas-doc,libatlas-dev,libatlas3gf-bas,libatlas-bas-dev安装了atlas包。
安装完毕后,我通过输入
检查numpy是否与地图集相关联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 / path并输入了
$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
以下步骤无法解决我的问题...
我意识到我的CPU限制已经开启,并且当CPU限制开启时ATLAS无法正常工作。所以,我使用rcconf将其关闭,并重新安装了Atlas,并重新安装了Numpy ......但它没有解决问题......
现在我正在运行python 2.7.5+,所以我也尝试重新安装它......没有解决问题。
我检查了我的记忆..
total used free shared buffers cached
记忆:5959 2345 3614 0 86 730
- / + buffers / cache:1528 4431
交换:6133 0 6133
我的记忆是免费的..我的matlab代码运行速度和以前一样快......所以我不认为这是内存问题..
有人可以帮忙吗?似乎numpy的线性代数包很慢......现在,它延迟了我的模拟,所以我无法真正运行我的代码。非常感谢你提前!如果我的问题中有任何混淆,请告诉我。!
答案 0 :(得分:6)
当你说“并重新安装Numpy”时,你使用了pip还是apt-get / synaptic?
通过apt-get install python-numpy
提供的NbuPy的Ubuntu(或Debian)打包版本已预先编译。另一方面,在NumPy源目录中使用pip install 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 installation guide或instructions to build NumPy and SciPy from source on Linux
这可能是你已经完成的事情,但是其他人可能会觉得它很有用!