У меня есть следующий скрипт:
#!/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
говорит мне, что запущена одна программа:
Если вместо этого я смотрю на 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
на
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
, однако мне интересно: возможно ли, что это вызывает такое странное поведение?
EDIT 1.1 Я немного упростил пример
РЕДАКТИРОВАТЬ 1.2 Поведение происходит, даже если я удаляю enumerate
. Просто кажется, что это «менее вероятно». Страннее и страннее для меня ...
РЕДАКТИРОВАТЬ 2 Поведение кажется (эти выводы кажутся очень убедительными) из-за scipy.stats.pearsonr(x,y)
. Кто-нибудь из экспертов по scipy знает почему?
EDIT 3 Вывод np.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)]
Я лично игнорирую его значение.