为什么在将Ubuntu从12.04升级到14.04后,Python的Numpy矩阵乘法变得如此缓慢?

4 投票
2 回答
1016 浏览
提问于 2025-04-18 17:22

我之前用的是Ubuntu 12.04,最近我重新安装了Ubuntu 14.04。我现在做的工作涉及到大矩阵的乘法(大约2000 X 2000),我用的是numpy库。问题是,现在计算的时间比之前慢了10到15倍。

从Ubuntu 12.04升级到14.04,意味着我从Python 2.7.3升级到了2.7.6,numpy也从1.6.1升级到了1.8.1。不过,我觉得问题可能出在numpy所链接的线性代数库上。我发现我只能找到libblas.so.3liblapack.so.3,而不是libblas.so.3gfliblapack.so.3gf

我还安装了libopenblas和libatlas:

$ sudo apt-get install libopenblas-base libatlas3-base

并尝试过这些库,但速度依然没有改善。所以,我有几个问题:

  1. 带有“gf”的包和没有“gf”的包有什么区别?
  2. 这可能是导致矩阵乘法变慢的原因吗?
  3. 如果是的话,我该如何回到libblas.so.3gf和liblapack.so.3gf?在Ubuntu 14.04中似乎已经不再提供这些了。

非常感谢!

2 个回答

2

你是在通过包管理器安装numpy吗?

如果是的话,我建议你用pip来安装,这样你可以清楚地看到在安装过程中哪些东西成功链接了。

  1. 先删除apt版本的numpy(运行sudo apt-get purge python-numpy
  2. 安装一些构建所需的头文件和静态库(运行sudo apt-get install libblas-dev liblapack-dev gfortran),可能还有其他的,但这些是我记得的。
  3. 然后运行pip install numpy来安装numpy。
5

wim说得对,问题可能是因为numpy链接到了一个比较慢的BLAS库(比如说参考的CBLAS库,而不是ATLAS)。

你可以通过在numpy的一个编译好的共享库上运行ldd这个工具,来检查在运行时链接的是哪个BLAS库。

例如,如果你是通过apt-get在标准位置安装的numpy:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
        ...
        libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f01f0188000)
        ...

这个输出告诉我,numpy链接的是/usr/lib/libblas.so.3。这通常是指向参考CBLAS库的一个符号链接,而这个库是比较慢的。

你可以像wim建议的那样,删除通过apt-get安装的numpy,然后自己编译一个,可以使用pip或者直接下载源代码。不过,我强烈不建议你使用sudo pip install ...来全局安装Python模块。这是一个不好的习惯,因为这样可能会破坏你系统中Python环境的依赖关系。

更安全的做法是使用pip install --user ...安装到你的~/.local/目录,或者更好的是,安装到一个完全独立的virtualenv中。

另一个选择是使用update-alternatives来强制你的系统全局numpy链接到一个不同的BLAS库。我之前写过一个回答,里面有说明怎么做。

撰写回答