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-learn 1.9.1 (pypi)
  • numpy 2.5.3 (pypi)
  • scipy 1.18.1 (pypi)
  • pandas 2.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

view pixi env JSON

sklearn-cf-libgomp-openblas

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

sklearn-cf-libomp-openblas-omp

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

sklearn-cf-mkl

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

linear - fit time - 44 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ
◇ Metrics differ from the baseline (1 point)

linear - predict time - 44 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ
Detailed results

tree-based - fit time - 94 cases

● Metrics and benchmark setup match the baseline

tree-based - predict time - 94 cases

● Metrics and benchmark setup match the baseline
Detailed results

clustering - fit time - 8 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ

clustering - predict time - 8 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 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-learn 1.9.1 (pypi)
  • numpy 2.5.3 (pypi)
  • scipy 1.18.1 (pypi)
  • pandas 2.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

view pixi env JSON

sklearn-cf-default

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.1 (conda-forge)
  • pandas 2.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

view pixi env JSON

sklearn-cf-libgomp-openblas

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

sklearn-cf-libomp-openblas-omp

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

sklearn-cf-mkl

Python 3.12.14

Packages

  • scikit-learn 1.9.1 (conda-forge)
  • numpy 2.5.3 (conda-forge)
  • scipy 1.18.0 (conda-forge)
  • pandas 2.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

view pixi env JSON

linear - fit time - 44 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ
◇ Metrics differ from the baseline (2 points)

linear - predict time - 44 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ
Detailed results

tree-based - fit time - 94 cases

● Metrics and benchmark setup match the baseline

tree-based - predict time - 94 cases

● Metrics and benchmark setup match the baseline
Detailed results

clustering - fit time - 8 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ

clustering - predict time - 8 cases

● Metrics and benchmark setup match the baseline
■ Metrics match the baseline, but some comparison details are worth reporting:
  • 🔁 Number of iteration differs: this might mean algorithms differ
Detailed results