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