Numpy排序比Matlab排序慢得多



我正在将一些代码从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

相关内容

  • 没有找到相关文章

最新更新