我正在將一些代碼從 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 為陣列并行作業?
uj5u.com熱心網友回復:
在花了幾個小時并與同事核對之后,解決方案現在很清楚:
np.sort不是多執行緒的,也沒有辦法加速它。
只需查看來源即可檢查這一點:
https://github.com/numpy/numpy/tree/main/numpy/core/src/npysort
對于如此重要??的功能,我感到很驚訝。像使用 np 排序的 99.9% 的代碼可以加速。我想我會用 Cython 實作我自己的排序功能。
最好的,
皮埃爾
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389989.html
