Scikit learn 当我使用sklearn并行模块时“;从cdnmf快速导入“更新cdnmf快速”;,它的并行化不起作用

Scikit learn 当我使用sklearn并行模块时“;从cdnmf快速导入“更新cdnmf快速”;,它的并行化不起作用,scikit-learn,cython,ipython-parallel,matrix-factorization,nmf,Scikit Learn,Cython,Ipython Parallel,Matrix Factorization,Nmf,(这是我第一次提问,如果您认为标签或描述有问题,请告诉我,谢谢!) 我正在做一项关于矩阵分解的工作,并使用模块sklearn.decomposition.nmf 该模块使用另一个模块 来自sklearn.decomposition.cdnmf\u fast import\u update\u cdnmf\u fast 此模块来自文件cdnmf\u fast。因此 你可以在这个网站上查看它的源代码 我们可以看到它使用C语言和“with nogil:”,所以我认为它一定使用了并行化。 因此,我编写了

(这是我第一次提问,如果您认为标签或描述有问题,请告诉我,谢谢!)

我正在做一项关于矩阵分解的工作,并使用模块
sklearn.decomposition.nmf
该模块使用另一个模块
来自sklearn.decomposition.cdnmf\u fast import\u update\u cdnmf\u fast
此模块来自文件
cdnmf\u fast。因此
你可以在这个网站上查看它的源代码 我们可以看到它使用C语言和“with nogil:”,所以我认为它一定使用了并行化。 因此,我编写了一个类似的代码来测试它,如下所示:

from sklearn.decomposition.cdnmf_fast import _update_cdnmf_fast
import numpy as np
from numpy import *
M = 3
X = zeros((M,M), dtype="float64")
U = ones((M,M), dtype="float64")
V = np.arange(M*M).reshape(M,M).astype("float64")
permutation = np.arange(M)
print X
print U
print V
print permutation
x = _update_cdnmf_fast(X,U,V,permutation)
print X
预期的结果是X=X+V-W*U=0+V-0=V。但是,结果很奇怪,而且比np.dot()慢得多。 然后我将此代码更改为普通python代码,而不是并行化代码。 结果和以前一样。 所以我确信它的并行化是不起作用的。 因为它在改变X的同时使用X,结果当然是错误的。 我不知道为什么它的并行化不起作用。 这是由于模块的缺陷还是我导入的方法

实际上,当我使用sklearn.decomposition.nmf模块时,这让我很担心,我不确定当我使用这个模块时,它的并行化是否也不起作用。所以我想知道它是如何使并行化工作的


谢谢你的帮助

使用nogil
不会使某些东西并行,它只会释放GIL,以便可以并行化(例如,可以从两个python线程调用该函数,并且它们可以同时运行)@chrisb是正确的。在这种情况下,函数看起来不像使用多个线程
np.dot
通常相当快,可能是并行的。