Numpy 排序比 Matlab 排序慢得多

Numpy sort much slower than Matlab sort

我正在将一些代码从 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 核机器上的主要原因。

现在我尝试了(在 this link 之后):

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()

returns

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实现我自己的排序功能。

最佳,

皮埃尔