Python 为什么scikit学习邻居的速度比n_jobs慢>;1和forkserver

Python 为什么scikit学习邻居的速度比n_jobs慢>;1和forkserver,python,scikit-learn,python-multiprocessing,Python,Scikit Learn,Python Multiprocessing,我正在使用scikit learn进行元启发式练习,我有一个疑问:我需要使用knn,所以我有一个n_jobs=-1的KNearestNeighbors对象。正如文档所说,我必须将多处理模式设置为forkserver。但是,与n_jobs=1相比,n_jobs=1时的knn速度要慢得多 这是一段代码 ### Some initialization here ### skf = StratifiedKFold(target, n_folds=2, shuffle=True) for train_i

我正在使用scikit learn进行元启发式练习,我有一个疑问:我需要使用knn,所以我有一个n_jobs=-1的KNearestNeighbors对象。正如文档所说,我必须将多处理模式设置为forkserver。但是,与n_jobs=1相比,n_jobs=1时的knn速度要慢得多

这是一段代码

### Some initialization here ###
skf = StratifiedKFold(target, n_folds=2, shuffle=True)

for train_index, test_index in skf:
       data_train, data_test = data[train_index], data[test_index]
       target_train, target_test = target[train_index], target[test_index]

       start = time()
       selected_features, score = SFS(data_train, data_test, target_train, target_test, knn)
       end = time()

       logger.info("SFS - Time elapsed: " + str(end-start) + ". Score: " + str(score) + ". Selected features: " + str(sum(selected_features)))
if __name__ == "__main__":
    import multiprocessing as mp; mp.set_start_method('forkserver', force = True)
    main()
这是SFS功能

def SFS(data_train, data_test, target_train, target_test, classifier):
    rowsize = len(data_train[0])
    selected_features = np.zeros(rowsize, dtype=np.bool)
    best_score = 0
    best_feature = 0

    while best_feature is not None:
        end = True
        best_feature = None

        for idx in range(rowsize):
            if selected_features[idx]:
                continue

            selected_features[idx] = True
            classifier.fit(data_train[:,selected_features], target_train)
            score = classifier.score(data_test[:,selected_features], target_test)
            selected_features[idx] = False

            if score > best_score:
                best_score = score
                best_feature = idx

        if best_feature is not None:
            selected_features[best_feature] = True

    return selected_features, best_score

我不明白为什么n_jobs>1比n_jobs=1慢。谁能给我解释一下吗?我试过使用3个数据集。

我发现很多像你这样的人都有同样的问题:n_jobs不在sklearn的KNearestNeighbors工作。他们还抱怨只加载了一个CPU内核

在我的实验中,无论n_jobs>1与否,拟合过程都只使用单核。因此,无论您是否将n_作业设置为大数量,如果您的列车数据样本很大,培训时间将是巨大的,而且不会减少


n_jobs>1比n_jobs=1更慢的原因是分配多处理资源的成本。

最后一个
openblas
问题,请参见:我不确定我是否同意这里的推理,但我确实分享了在sklearn的ElasticNetCV上增加n_jobs会降低性能的经验