我想运行以下脚本:
#python imports
import time
#3rd party imports
import numpy as np
import pandas as pd
def pd_svd(pd_dataframe):
np_dataframe = pd_dataframe.values
return np.linalg.svd(pd_dataframe)
if __name__ == '__main__':
li_times = []
for i in range(1, 3):
start = time.time()
pd_dataframe = pd.DataFrame(np.random.random((3000, 252 * i)))
pd_svd(pd_dataframe)
li_times.append(str(time.time() - start))
print li_times
我在运行OSX 10.9.4的Macbook Air 2011和运行Ubuntu 12.0.4的16核云虚拟机上试用。出于某种原因,我的Macbook Air大约需要4秒钟,而我的VM大约需要15秒。我使用top
检查了进程,看来在我的Ubuntu VM上,它没有使用并行性,而在我的Macbook Air上,它是。
以下是我工商管理硕士学位的结果:
在我的ubuntu VM上:
为什么我的Macbook Air对于SVD来说要快得多?特别是,在进行numpy比较时,云VM的速度要快得多,并且似乎使用了并行性(没有top
,但它的速度要快几倍。)
以下是云VM上np.show_config()
的输出:
blas_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
lapack_info:
libraries = ['lapack']
library_dirs = ['/usr/lib']
language = f77
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
libraries = ['blas']
library_dirs = ['/usr/lib']
language = f77
define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
NOT AVAILABLE
lapack_opt_info:
libraries = ['lapack', 'blas']
library_dirs = ['/usr/lib']
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
答案 0 :(得分:3)
我怀疑您的云虚拟机上的numpy版本仅链接到参考CBLAS库(* /usr/lib/libblas/libblas.so.3.0
)。这是单线程的,比其他优化的BLAS实现(如OpenBLAS和ATLAS)慢得多。
您可以使用ldd
确认在运行时通过numpy动态链接哪些库来确认:
~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
你可能会看到这样的一行:
...
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f98445e3000)
...
/usr/lib/libblas.so.3
是一个符号链接。如果您使用readlink
关注链接链,您可能会看到以下内容:
~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/libblas/libblas.so.3.0
这是一个缓慢的单线程CBLAS库。假设您具有root访问权限,最简单的解决方案可能是通过apt-get
安装OpenBLAS:
~$ sudo apt-get install libopenblas-base libopenblas-dev
当我在我的服务器上安装此软件包时,它更新了/usr/lib/libblas.so.3
处的符号链接以指向OpenBLAS库而不是CBLAS:
~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3
希望这足以让你使用更快的BLAS库。
如果出于某种原因,您无法使用apt-get
解决此问题,我之前已经编写过一些有关从源which you can find here构建numpy和OpenBLAS的说明。我还编写了一些说明here,以便使用update-alternatives
手动符号链接到不同的BLAS库。
*我在答案中引用的路径是运行Ubuntu 14.10的服务器的默认值,我使用apt-get
安装了numpy。它们可能会有所不同,具体取决于您的Ubuntu版本以及您安装numpy的方式。