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实现我自己的排序功能。
最佳,
皮埃尔
我正在将一些代码从 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实现我自己的排序功能。
最佳,
皮埃尔