gpt4 book ai didi

python - scipy PIL 逊系数显然自发地并行计算

转载 作者:行者123 更新时间:2023-12-01 06:35:11 25 4
gpt4 key购买 nike

我有以下脚本:

#!/usr/bin/env python

import numpy as np
import scipy.stats as sts

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

my_list = [x for x in range(10**6)]
tau_max = 10**5

tau_vals = sorted(list(set(np.geomspace(1, tau_max, num=10**4, dtype=int))))
res = np.zeros((len(tau_vals), 2))
res[:, 0] = tau_vals

print('go for computations')

res = corr_funct(my_list, res, tau_vals)

np.save('my_res.npy', res)

问题如下:当我启动它时,一切都很好。当它“进行计算”并调用 corr_funct() 时,会发生以下情况:top 告诉我有一个程序正在运行:

enter image description here

如果我查看 htop,我会看到启动了许多线程:

enter image description here

进程正在休眠,但我被告知这会减慢计算速度。我不明白发生了什么。

为了让事情变得更奇怪,我注意到如果我替换

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

def corr_funct(X, res, tau_vals):

z = 0
for tau in tau_vals:
x = X[:-tau]
y = X[tau:]
r, p = sts.pearsonr(x, y)
res[z, 1] = r
z += 1

return res

奇怪的行为(似乎)不再发生了。我完全不知道发生了什么,但我看不出我的代码有任何问题,而且它似乎是由于 enumerate 导致的,这一事实让事情对我来说更加奇怪。

我对使用 enumerate 并不陌生,但我想知道:它是否有可能导致这种奇怪的行为?

编辑 1.1 我稍微简化了示例

编辑 1.2 即使我删除 enumerate,该行为也会发生。这似乎“不太可能”发生。对我来说越来越奇怪......

编辑 2 该行为似乎(这一发现似乎非常可靠)是由于 scipy.stats.pearsonr(x,y) 造成的。有scipy专家知道为什么吗?

编辑 3np.show_config 的输出如下:

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 使用的线程数,请更改环境变量 OPENBLAS_NUM_THREADS。例如。看看设置 OPENBLAS_NUM_THREADS=1 是否会产生串行行为。

您可以在 Python 脚本中执行此操作

import os

os.environ['OPENBLAS_NUM_THREADS'] = 1

从外部 Python 来看,它将取决于您正在使用的操作系统。例如,在 Linux 或 Mac OS 中,要仅为正在运行的 Python 命令设置环境变量,您可以使用

$ OPENBLAS_NUM_THREADS=1 python myscript.py

搜索“设置环境变量”以获取更多信息。

如果设置 OPENBLAS_NUM_THREADS 不起作用,请尝试设置 OMP_NUM_THREADS=1

欲了解更多信息,请访问 https://github.com/xianyi/OpenBLAS/blob/develop/README.md#setting-the-number-of-threads-using-environment-variables .

关于python - scipy PIL 逊系数显然自发地并行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59701531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com