#25812·scikit-learn

在拟合时,使用多线程可以提高 kd-tree 或 ball-tree 的性能

作者: ogrisel创建于 2023年3月10日更新于 2026年9月28日
标签Performance

如上文所述: https://skops.readthedocs.io/en/latest/auto_examples/plot_intelex.html 对于小的 `n_features`, `KNeighborsClassifier` 使用 BallTree 或 KD-tree 算法。目前,scikit-learn 以顺序构建此树。我们可以使用 `ThreadPoolExecutor` 实例递归并行构建分支,并为给定节点的每个子节点调用 `submit`。请注意,从根节点开始的每个节点分割操作都是一个 Cython 函数调用,该调用会释放 GIL,因此使用基于线程的并行算法应该是高效的。 plot_intelex.html 中上文中报告的第二个加速(在推理时)主要与 scikit-learn `KNeighborsClassifier` 在使用 kd-tree 或 ball-tree 算法时默认设置 `n_jobs` 无法启用并行邻居查询有关。从用户的角度来看,这也不是理想的:使用暴力算法时,我们依赖 OpenMP 并自动使用可用的 CPU 线程数。

内容来源: scikit-learn/scikit-learn