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
通常相当快,可能是并行的。