我正在将一些代码从Matlab转换为Python。我有时会对演出失利感到非常惊讶。下面是一个关于数组排序的例子,这让我抓狂。
Matlab:
a=rand(50000,1000);tic;b=sort(a,1);toc
运行时间为0.624460秒
Python:
import numpy as np
import time
a=np.random.rand(50000,1000);
t0=time.time();b=np.sort(a,axis=0);print(time.time()-t0)
4.192200422286987
有人能解释为什么这样一个基本操作的性能有一个因子7吗?我发现这种排序在Python上不是多线程的,这应该是我的20核机器的主要原因。
现在我尝试了(点击此链接(:
sudo apt update
sudo apt install intel-mkl-full
conda install -c intel numpy
但这并没有改变这种行为。在一个终端中,我还键入了
export MKL_NUM_THREADS=20
export NUMEXPR_NUM_THREADS=20
export OMP_NUM_THREADS=20
在Python中,以下命令
np.show_config()
返回
blas_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/home/pierre/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/pierre/anaconda3/include']
blas_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/home/pierre/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/pierre/anaconda3/include']
lapack_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/home/pierre/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/pierre/anaconda3/include']
lapack_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['/home/pierre/anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/home/pierre/anaconda3/include']
这似乎表明我真的在使用MKL。有没有一种方法可以让np.sort为数组并行工作?
在花了几个小时与同事核实后,解决方案现在很清楚:
np.sort不是多线程的,没有办法加速它。
只需查看来源即可检查:
https://github.com/numpy/numpy/tree/main/numpy/core/src/npysort
对于这样一个重要的函数,我感到惊讶。就像99.9%使用np排序的代码可以加速一样。我想我会用Cython实现我自己的排序功能。
最佳,
Pierre