This dashboard compares buildsOne packaging of the same scikit-learn version. Here, builds differ by their BLAS and OpenMP libraries. of plain scikit-learn. The code is the same, only the BLAS/OpenMP runtimeThe BLAS and OpenMP libraries loaded at run time. They do the multithreaded number crunching for scikit-learn. changes (for example conda-forgeCommunity-maintained channel of conda packages. Its scikit-learn can be installed with different BLAS and OpenMP libraries.'s MKLIntel's Math Kernel Library (oneMKL): a BLAS implementation tuned for Intel CPUs, available as a conda-forge build option., or its libgompGCC's OpenMP runtime, used by the PyPI scikit-learn wheels on Linux. and libompLLVM's OpenMP runtime, used by the PyPI scikit-learn wheels on macOS. OpenBLASOpen-source BLAS implementation. The NumPy and SciPy wheels on PyPI each ship their own copy of it. builds). The PyPI wheelThe Python Package Index, where pip installs packages from. Its scikit-learn wheels bundle their own OpenMP runtime, and NumPy and SciPy bundle OpenBLAS. is the baselineThe reference that speed-ups are computed against..
How to read
Read each cell like in the software/implementations dashboard: fitTraining a model on data. More in the scikit-learn glossary or predictMaking predictions with a fitted model. More in the scikit-learn glossary speed-upBaseline time divided by the compared time: 2x is twice as fast as the baseline, 0.5x twice as slow. (log scale) per estimator category, one line per build.
Findings
- MKLIntel's Math Kernel Library (oneMKL): a BLAS implementation tuned for Intel CPUs, available as a conda-forge build option. is a good pick for linear models: it speeds up BLASBasic Linear Algebra Subprograms: the library that runs the matrix and vector products of NumPy and SciPy. OpenBLAS and MKL are two implementations of it.-bound linear model fits, commonly by 1.3x to 1.5x.
- On the laptop, every conda-forgeCommunity-maintained channel of conda packages. Its scikit-learn can be installed with different BLAS and OpenMP libraries. build fits LogisticRegression much faster than the PyPIThe Python Package Index, where pip installs packages from. Its scikit-learn wheels bundle their own OpenMP runtime, and NumPy and SciPy bundle OpenBLAS. one, up to ~10x on some datasets. This comes from the OpenBLASOpen-source BLAS implementation. The NumPy and SciPy wheels on PyPI each ship their own copy of it. shipped in scipy and is going to be fixed in scipy soon, see scipy#26193.
- HistGradientBoosting varies more between builds. On laptops, this comes from differences in active waitIdle OpenMP threads spin on the CPU for a while before sleeping, so they start the next parallel loop faster, at the cost of CPU time. (how long idle OpenMP threadsStandard for running the loops of compiled code on several threads. scikit-learn's Cython code (HistGradientBoosting, KMeans, ...) uses it. spin before sleeping), which conda-forge disables by default. Without active wait, HGB fits on small and medium datasets can be much slower. On the high-end server, the LLVM/Intel OpenMPLLVM's OpenMP runtime (libomp) and Intel's (libiomp5), which share most of their code. runtimes seem faster than libgompGCC's OpenMP runtime, used by the PyPI scikit-learn wheels on Linux.. See scikit-learn#34764 for the analysis, and scikit-learn#34935 for a fix in progress, based on the insights from the HistGradientBoosting thread-scalability breakdown plots.
- ExtraTrees fits are ~25% slower on conda-forge builds. scikit-learn#34876 fixes it and will land in the next release.
Hardware
CPU
Intel(R) Core(TM) Ultra X7 358H
X86_64, 16 physical cores, 16 logical CPUs
31 GB RAM
$1,299, released 2026
GPU(s)
level_zero:gpu:0: Intel(R) Arc(TM) B390 GPU (29 GB, integrated, priced with the CPU)
sklearn-pypi
Python 3.12.14
Packages
scikit-learn1.9.1 (pypi)numpy2.5.3 (pypi)scipy1.18.1 (pypi)pandas2.3.3 (pypi)
Threadpools
- libscipy_openblas 0.3.31.dev (16 threads)
- libscipy_openblas 0.3.34.106.0 (16 threads)
- libgomp (16 threads)
OpenMP
- GNU libgomp (OpenMP 4.5)
- GOMP_SPINCOUNT: 300000
Full environment
sklearn-cf-libgomp-openblas
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libopenblas 0.3.34 (16 threads)
- libgomp (16 threads)
OpenMP
- GNU libgomp (OpenMP 5.2)
- GOMP_SPINCOUNT: 1
Full environment
sklearn-cf-libomp-openblas-omp
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libopenblas 0.3.34 (16 threads)
- libomp (16 threads)
OpenMP
- Intel/LLVM OpenMP (spec 201611)
- KMP_BLOCKTIME: 0ms
Full environment
sklearn-cf-mkl
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libmkl_rt 2026.1-Product (16 threads)
- libomp (16 threads)
OpenMP
- Intel/LLVM OpenMP (spec 201611)
- KMP_BLOCKTIME: 0ms
Full environment
linear - fit time - 44 cases
- Number of iteration differs: this might mean algorithms differ
linear - predict time - 44 cases
- Number of iteration differs: this might mean algorithms differ
Detailed results
tree-based - fit time - 94 cases
tree-based - predict time - 94 cases
Detailed results
clustering - fit time - 8 cases
- Number of iteration differs: this might mean algorithms differ
clustering - predict time - 8 cases
- Number of iteration differs: this might mean algorithms differ
Detailed results
Hardware
CPU
Intel(R) Xeon(R) 6787P
X86_64, 172 physical cores, 344 logical CPUs
499 GB RAM
$11,648, released 2025
GPU(s)
No GPU detected.
sklearn-pypi
Python 3.12.14
Packages
scikit-learn1.9.1 (pypi)numpy2.5.3 (pypi)scipy1.18.1 (pypi)pandas2.3.3 (pypi)
Threadpools
- libscipy_openblas 0.3.31.dev (64 threads)
- libscipy_openblas 0.3.34.106.0 (64 threads)
- libgomp (344 threads)
OpenMP
- GNU libgomp (OpenMP 4.5)
- GOMP_SPINCOUNT: 300000
Full environment
sklearn-cf-default
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.1 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libopenblas 0.3.34 (128 threads)
- libgomp (344 threads)
OpenMP
- GNU libgomp (OpenMP 5.2)
- GOMP_SPINCOUNT: 300000
Full environment
sklearn-cf-libgomp-openblas
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libopenblas 0.3.34 (128 threads)
- libgomp (344 threads)
OpenMP
- GNU libgomp (OpenMP 5.2)
- GOMP_SPINCOUNT: 300000
Full environment
sklearn-cf-libomp-openblas-omp
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libopenblas 0.3.34 (128 threads)
- libomp (344 threads)
OpenMP
- Intel/LLVM OpenMP (spec 201611)
- KMP_BLOCKTIME: 200ms
Full environment
sklearn-cf-mkl
Python 3.12.14
Packages
scikit-learn1.9.1 (conda-forge)numpy2.5.3 (conda-forge)scipy1.18.0 (conda-forge)pandas2.3.3 (conda-forge)
Threadpools
- libmkl_rt 2026.1-Product (172 threads)
- libomp (344 threads)
OpenMP
- Intel/LLVM OpenMP (spec 201611)
- KMP_BLOCKTIME: 200ms
Full environment
linear - fit time - 44 cases
- Number of iteration differs: this might mean algorithms differ
linear - predict time - 44 cases
- Number of iteration differs: this might mean algorithms differ
Detailed results
tree-based - fit time - 94 cases
tree-based - predict time - 94 cases
Detailed results
clustering - fit time - 8 cases
- Number of iteration differs: this might mean algorithms differ
clustering - predict time - 8 cases
- Number of iteration differs: this might mean algorithms differ