Python scipy-pearson系数显然可以自发地并行计算
我有以下脚本:Python scipy-pearson系数显然可以自发地并行计算,python,scipy,Python,Scipy,我有以下脚本: #/usr/bin/env python 将numpy作为np导入 将scipy.stats导入为sts def corr_函数(X,res,tau_vals): 对于z,枚举中的tau(tau_vals): x=x[:-tau] y=X[tau:] r、 p=sts.pearsonr(x,y) res[z,1]=r 返回res my_list=[x代表范围内的x(10**6)] tau_max=10**5 tau_vals=sorted(列表(集合(np.geomspace(1
#/usr/bin/env python
将numpy作为np导入
将scipy.stats导入为sts
def corr_函数(X,res,tau_vals):
对于z,枚举中的tau(tau_vals):
x=x[:-tau]
y=X[tau:]
r、 p=sts.pearsonr(x,y)
res[z,1]=r
返回res
my_list=[x代表范围内的x(10**6)]
tau_max=10**5
tau_vals=sorted(列表(集合(np.geomspace(1,tau_max,num=10**4,dtype=int)))
res=np.零(len(tau_vals),2))
res[:,0]=tau_vals
打印(“进行计算”)
res=corr_funct(我的列表、res、tau_vals)
np.save('my_res.npy',res)
问题如下:当我启动它时,一切都很好。当它“进行计算”并调用corr_funct()
时,会发生以下情况:top
告诉我有一个程序正在运行:
相反,如果我查看htop
我会看到许多线程启动:
进程正在休眠,但有人告诉我它会减慢计算速度。我不明白发生了什么事
更奇怪的是,我注意到如果我
def corr_funct(X, res, tau_vals):
for z, tau in enumerate(tau_vals):
x = X[:-tau]
y = X[tau:]
r, p = sts.pearsonr(x, y)
res[z, 1] = r
return res
与
这种奇怪的行为似乎不再发生了。我完全不知道发生了什么,但我看不出我的代码有任何错误,而且这似乎是由于enumerate
造成的,这让我觉得更奇怪
我对使用枚举
并不陌生,但我想知道:它是否可能导致这种奇怪的行为
编辑1.1我简化了一点示例
编辑1.2即使我删除了enumerate
,行为也会发生。这似乎“不太可能”发生。对我来说越来越奇怪
编辑2该行为似乎(该发现似乎非常可靠)是由于scipy.stats.pearsonr(x,y)
造成的。有人知道为什么吗
编辑3显示配置的输出如下所示:
np.show_config()
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
我个人忽略了它的含义。SciPy使用NumPy,SciPy和NumPy都依赖于底层的BLAS库 从
numpy.show_config()
的输出中,我们看到您安装的numpy正在使用库。要更改OpenBLAS使用的线程数,请更改环境变量OpenBLAS\u NUM\u threads
。例如,查看设置OPENBLAS\u NUM\u THREADS=1是否提供串行行为
您可以在Python脚本中使用
import os
os.environ['OPENBLAS_NUM_THREADS'] = 1
在Python之外,它将取决于您使用的操作系统。例如,在Linux或Mac OS中,要仅为正在运行的Python命令设置环境变量,可以使用
$ OPENBLAS_NUM_THREADS=1 python myscript.py
有关详细信息,请搜索“设置环境变量”
如果设置OPENBLAS\u NUM\u THREADS
无效,请尝试设置OMP\u NUM\u THREADS=1
更多信息请访问。有趣的观察,谢谢。你对这一事实的后果有什么猜测吗?scipy
在引擎盖下使用numpy
,它经过优化以利用多线程和多处理。显示np.Show_config()
的输出。这将告诉您安装numpy所使用的基础BLAS库。它成功了,谢谢。我是通过导入os.environ[“OPENBLAS\u NUM\u THREADS”]=“1”
实现的。如果这是一种标准的方式,没有问题,写在答案中,我会接受。再次感谢。您使用的是什么平台?Linux?>>os.name'posix'>>>platform.system()'Linux'
如果让线程数大于1,代码会更高效吗?说4。。。
$ OPENBLAS_NUM_THREADS=1 python myscript.py