Python Numpy.dot работает в 20 раз медленнее после обновления Ubuntu до 13.10 от 13.04

Как видно из названия, 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.

После установки этого параметра я проверил, связано ли 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

Следующие шаги не устранили мою проблему...

  1. И я понял, что мое дроссельное управление процессором включено, и что ATLAS не работает хорошо, когда происходит дросселирование ЦП. Итак, я отключил его с помощью rcconf и переустановил Atlas, как указано выше, и снова установил Numpy... Но это не решает проблему...

  2. Теперь я запускаю python 2.7.5+, поэтому я попытался переустановить его также.. не решил проблему.

  3. Я проверил свою память.

             total       used       free     shared    buffers     cached
    

    Mem: 5959 2345 3614 0 86 730

    -/+ буферы/кеш: 1528 4431

    Обмен: 6133 0 6133

И моя память бесплатна.. и мой код matlab работает так же быстро, как раньше.. поэтому я не думаю, что это проблема с памятью.

Может ли кто-нибудь помочь, пожалуйста? Кажется, что пакет линейной алгебры numpy медленный... Теперь он очень сильно задерживает мою симуляцию, поэтому я не могу запустить мои коды. Заранее большое спасибо! Дайте мне знать, если есть какая-то путаница в моем вопросе.!

Ответ 1

Когда вы говорите "и снова установили Numpy", вы использовали pip или apt-get/synaptic?

Ubuntu (или Debian) упакованная версия NumPy, доступная через apt-get install python-numpy, предварительно выполнена. С другой стороны, установка NumPy с использованием pip install numpy или python setup.py в исходном каталоге NumPy использует доступные компиляторы для создания NumPy из источника.

Затем вы можете скомпилировать NumPy с помощью ATLAS на своем собственном компьютере. ATLAS оптимизирует библиотеку NumPy, используя характеристики вашего компьютера (фактически требуется отключить дросселирование процессора).

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 или для создания NumPy и SciPy из источника в Linux

Это может быть то, что вы уже сделали, но тогда кто-то может найти его полезным!