PERF: models with multithreading being slower than the same model with a single thread

While working on `skops`'s persistence, I realized sometimes it's faster for me to set `OMP_NUM_THREADS=1`.

I tried to isolate the issue. The differences here aren't large, and couldn't reproduce a massive difference, but in terms of proportions, the diffs are sometimes significant.

Here's the code to run the relevant tests, w/o any `skops` dependency:
 <details>

```py
import warnings
from functools import partial
from time import perf_counter

import numpy as np
import pytest
from scipy import sparse, special
from sklearn.base import is_regressor
from sklearn.cluster import Birch
from sklearn.compose import ColumnTransformer
from sklearn.datasets import load_sample_images, make_classification, make_regression
from sklearn.decomposition import SparseCoder
from sklearn.exceptions import SkipTestWarning
from sklearn.experimental import enable_halving_search_cv  # noqa
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import (
    GridSearchCV,
    HalvingGridSearchCV,
    HalvingRandomSearchCV,
    RandomizedSearchCV,
)
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.preprocessing import (
    FunctionTransformer,
    MinMaxScaler,
    Normalizer,
    PolynomialFeatures,
    StandardScaler,
)
from sklearn.utils import all_estimators
from sklearn.utils._tags import _safe_tags
from sklearn.utils._testing import SkipTest, set_random_state
from sklearn.utils.estimator_checks import (
    _construct_instance,
    _enforce_estimator_tags_y,
    _get_check_estimator_ids,
)

UNSUPPORTED_TYPES = {Birch}

# Default settings for X
N_SAMPLES = 50
N_FEATURES = 20


def _tested_estimators(type_filter=None):
    for name, Estimator in all_estimators(type_filter=type_filter):
        if Estimator in UNSUPPORTED_TYPES:
            continue
        try:
            # suppress warnings here for skipped estimators.
            with warnings.catch_warnings():
                warnings.filterwarnings(
                    "ignore",
                    category=SkipTestWarning,
                    message="Can't instantiate estimator",
                )
                estimator = _construct_instance(Estimator)
                # with the kind of data we pass, it needs to be 1 for the few
                # estimators which have this.
                if "n_components" in estimator.get_params():
                    estimator.set_params(n_components=1)
                    # Then n_best needs to be <= n_components
                    if "n_best" in estimator.get_params():
                        estimator.set_params(n_best=1)
                if "patch_size" in estimator.get_params():
                    # set patch size to fix PatchExtractor test.
                    estimator.set_params(patch_size=(3, 3))
        except SkipTest:
            continue

        yield estimator

    # nested Pipeline & FeatureUnion
    # fmt: off
    yield Pipeline([
        ("features", FeatureUnion([
            ("scaler", StandardScaler()),
            ("scaled-poly", Pipeline([
                ("polys", FeatureUnion([
                    ("poly1", PolynomialFeatures()),
                    ("poly2", PolynomialFeatures(degree=3, include_bias=False))
                ])),
                ("scale", MinMaxScaler()),
            ])),
        ])),
        ("clf", LogisticRegression(random_state=0, solver="liblinear")),
    ])
    # fmt: on

    # FunctionTransformer with numpy functions
    yield FunctionTransformer(
        func=np.sqrt,
        inverse_func=np.square,
    )

    # FunctionTransformer with scipy functions - problem is that they look like
    # numpy ufuncs
    yield FunctionTransformer(
        func=special.erf,
        inverse_func=special.erfinv,
    )

    # partial functions should be supported
    yield FunctionTransformer(
        func=partial(np.add, 10),
        inverse_func=partial(np.add, -10),
    )

    yield KNeighborsClassifier(algorithm="kd_tree")
    yield KNeighborsRegressor(algorithm="ball_tree")

    yield ColumnTransformer(
        [
            ("norm1", Normalizer(norm="l1"), [0]),
            ("norm2", Normalizer(norm="l1"), [1, 2]),
            ("norm3", Normalizer(norm="l1"), [True] + (N_FEATURES - 1) * [False]),
            ("norm4", Normalizer(norm="l1"), np.array([1, 2])),
            ("norm5", Normalizer(norm="l1"), slice(3)),
            ("norm6", Normalizer(norm="l1"), slice(-10, -3, 2)),
        ],
    )

    yield GridSearchCV(
        LogisticRegression(random_state=0, solver="liblinear"),
        {"C": [1, 2, 3, 4, 5]},
    )

    yield HalvingGridSearchCV(
        LogisticRegression(random_state=0, solver="liblinear"),
        {"C": [1, 2, 3, 4, 5]},
    )

    yield HalvingRandomSearchCV(
        LogisticRegression(random_state=0, solver="liblinear"),
        {"C": [1, 2, 3, 4, 5]},
    )

    yield RandomizedSearchCV(
        LogisticRegression(random_state=0, solver="liblinear"),
        {"C": [1, 2, 3, 4, 5]},
        n_iter=3,
    )

    dictionary = np.random.randint(-2, 3, size=(5, N_FEATURES)).astype(float)
    yield SparseCoder(
        dictionary=dictionary,
        transform_algorithm="lasso_lars",
    )


def get_input(estimator):
    # Return a valid input for estimator.fit

    # TODO: make this a parameter and test with sparse data
    # TODO: try with pandas.DataFrame as well
    if is_regressor(estimator):
        # classifier data can lead to failure of certain regressors to fit, e.g.
        # RANSAC in sklearn 0.24, so regression data is needed
        X, y = make_regression(
            n_samples=N_SAMPLES, n_features=N_FEATURES, random_state=0
        )
    else:
        X, y = make_classification(
            n_samples=N_SAMPLES, n_features=N_FEATURES, random_state=0
        )
    y = _enforce_estimator_tags_y(estimator, y)
    tags = _safe_tags(estimator)

    if tags["pairwise"] is True:
        return np.random.rand(N_FEATURES, N_FEATURES), None

    if "2darray" in tags["X_types"]:
        # Some models require positive X
        return np.abs(X), y

    if "1darray" in tags["X_types"]:
        return X[:, 0], y

    if "3darray" in tags["X_types"]:
        return load_sample_images().images[1], None

    if "1dlabels" in tags["X_types"]:
        # model only expects y
        return y, None

    if "2dlabels" in tags["X_types"]:
        return [(1, 2), (3,)], None

    if "categorical" in tags["X_types"]:
        return [["Male", 1], ["Female", 3], ["Female", 2]], None

    if "dict" in tags["X_types"]:
        return [{"foo": 1, "bar": 2}, {"foo": 3, "baz": 1}], None

    if "string" in tags["X_types"]:
        return [
            "This is the first document.",
            "This document is the second document.",
            "And this is the third one.",
            "Is this the first document?",
        ], None

    if tags["X_types"] == "sparse":
        # TfidfTransformer in sklearn 0.24 needs this
        return sparse.csr_matrix(X), y

    raise ValueError(f"Unsupported X type for estimator: {tags['X_types']}")


class catchtime:
    def __init__(self, obj):
        self.obj = obj

    def __enter__(self):
        self.time = perf_counter()
        return self

    def __exit__(self, type, value, traceback):
        self.time = perf_counter() - self.time
        with open("/tmp/times.csv", "a") as f:
            f.write(f'"{str(self.obj)}",{self.time}\n')


@pytest.mark.parametrize(
    "estimator", _tested_estimators(), ids=_get_check_estimator_ids
)
def test_can_persist_fitted(estimator, request):
    """Check that fitted estimators can be persisted and return the right results."""
    set_random_state(estimator, random_state=0)

    with catchtime(request.node.name):
        X, y = get_input(estimator)
        tags = _safe_tags(estimator)
        if tags.get("requires_fit", True):
            with warnings.catch_warnings():
                warnings.filterwarnings("ignore", module="sklearn")
                if y is not None:
                    estimator.fit(X, y)
                else:
                    estimator.fit(X)
```

</details>

The two compared runs are:

```bash
OMP_NUM_THREADS=1 /bin/time pytest -vv -s -x /tmp/test_persist.py
```

and 

```bash
/bin/time pytest -vv -s -x /tmp/test_persist.py
```

And merging the outputs of the files, calculating the time diff and sorting them, on my system I get:

__EDIT__: report and sort based on `multi / single` times.

<details>

```csv
"test","time_single","time_multi","multi-single","multi / single"
"test_can_persist_fitted[LocalOutlierFactor()]","0.0010714689997257","0.0927494520001346",0.0916779830004089,86.56288891594512
"test_can_persist_fitted[GammaRegressor()]","0.0021223299991106","0.0836087440111441",0.08148641401203349,39.39478971045117
"test_can_persist_fitted[TweedieRegressor()]","0.0027183700003661","0.1029384389985352",0.10022006899816911,37.867707112965434
"test_can_persist_fitted[BisectingKMeans()]","0.0024171370023395","0.0770646570017561",0.0746475199994166,31.882618538860942
"test_can_persist_fitted[MiniBatchNMF(n_components=1)]","0.0018326569988857","0.0317566099984105",0.0299239529995248,17.328179805451477
"test_can_persist_fitted[SpectralCoclustering()]","0.008189896994736","0.1385050719982246",0.1303151750034886,16.911698900150732
"test_can_persist_fitted[GaussianMixture()]","0.0023726949875708","0.0248366449959576",0.022463950008386798,10.467693962377238
"test_can_persist_fitted[Isomap(n_components=1)]","0.0028434790001483","0.0244207729992922",0.0215772939991439,8.588343011507575
"test_can_persist_fitted[KMeans()]","0.0126020519965095","0.0913419629941927",0.0787399109976832,7.248181726237321
"test_can_persist_fitted[OPTICS()]","0.0183498749975115","0.1283333730098093",0.10998349801229779,6.993691947613436
"test_can_persist_fitted[HistGradientBoostingClassifier()]","0.0225414900050964","0.137676618003752",0.1151351279986556,6.107698203296443
"test_can_persist_fitted[SpectralBiclustering(n_best=1,n_components=1)]","0.0242698249930981","0.133240677008871",0.10897085201577289,5.489972714956216
"test_can_persist_fitted[LocallyLinearEmbedding(n_components=1)]","0.0047033659939188","0.0194478940102271",0.014744528016308302,4.134888510775514
"test_can_persist_fitted[QuantileRegressor()]","0.0140205890056677","0.057087950001005",0.0430673609953373,4.071722662858721
"test_can_persist_fitted[NuSVR()]","0.0007767990027787","0.0029766740044578",0.0021998750016791,3.8319745440067408
"test_can_persist_fitted[Nystroem(n_components=1)]","0.0009555270080454","0.0036264819937059",0.0026709549856605,3.79526895961228
"test_can_persist_fitted[SplineTransformer()]","0.0009607859974494","0.003511870992952",0.0025510849955026,3.6552062605772453
"test_can_persist_fitted[NuSVC()]","0.0012937059946125","0.0044799390016123",0.0031862330069998,3.462872569400255
"test_can_persist_fitted[Normalizer()]","0.0006453480018535","0.0022331239888444",0.0015877759869909,3.460340750154426
"test_can_persist_fitted[OAS()]","0.0009089880040846","0.0030464559968095",0.0021374679927249,3.3514809690777447
"test_can_persist_fitted[GaussianRandomProjection(n_components=1)]","0.0008345539972651","0.0027637859893729",0.0019292319921078,3.3116922313355963
"test_can_persist_fitted[NMF(n_components=1)]","0.0047911790024954","0.0157362389873014",0.010945059984806,3.2844189246750037
"test_can_persist_fitted[KBinsDiscretizer()]","0.0043756679951911","0.0142683290032437",0.0098926610080526,3.260834464343439
"test_can_persist_fitted[NeighborhoodComponentsAnalysis(n_components=1)]","0.0090429139963816","0.0284530789940617",0.0194101649976801,3.146450248829837
"test_can_persist_fitted[IsotonicRegression()]","0.0007055559981381","0.0021990679961163",0.0014935119979782,3.1167873307284557
"test_can_persist_fitted[LarsCV()]","0.0121437859925208","0.0369784909998998",0.024834705007379,3.0450545672226412
"test_can_persist_fitted[QuantileTransformer()]","0.0028861119935754","0.0087746539938962",0.0058885420003208,3.040302667889856
"test_can_persist_fitted[FeatureAgglomeration()]","0.0009043379977811","0.0027028719923691",0.001798533994588,2.988785165503291
"test_can_persist_fitted[BernoulliRBM(n_components=1)]","0.0033446660090703","0.0098701509996317",0.0065254849905614,2.9510124397668203
"test_can_persist_fitted[Binarizer()]","0.000752874999307","0.0022121270012576",0.0014592520019505997,2.9382394199485966
"test_can_persist_fitted[Lasso()]","0.0009258329955628","0.0027034779923269",0.0017776449967641002,2.9200493018543763
"test_can_persist_fitted[LinearSVR()]","0.0007726479962002","0.0022275270021054",0.0014548790059052,2.88297777650384
"test_can_persist_fitted[Lars()]","0.0027890229976037","0.0080353840021416",0.005246361004537901,2.8810748455805206
"test_can_persist_fitted[LogisticRegression()]","0.0034757880057441","0.0099455789895728",0.0064697909838287,2.861388258759366
"test_can_persist_fitted[GenericUnivariateSelect()]","0.0011314559960737","0.0032270969968521",0.0020956410007784,2.852163060738153
"test_can_persist_fitted[LinearSVC()]","0.0029173670045565","0.0082459510012995",0.005328583996743,2.8265045119179497
"test_can_persist_fitted[NearestCentroid()]","0.0010163379920413","0.0028491499979281",0.0018328120058868,2.803348905815893
"test_can_persist_fitted[FastICA(n_components=1)]","0.0015253439923981","0.0042679670004872",0.0027426230080890997,2.7980357360422223
"test_can_persist_fitted[SkewedChi2Sampler(n_components=1)]","0.0008273340063169","0.0022919409966561",0.0014646069903391998,2.770272923821048
"test_can_persist_fitted[FunctionTransformer()]","0.0007347120117628","0.0020166000031167",0.0012818879913538998,2.7447489231573288
"test_can_persist_fitted[LinearDiscriminantAnalysis(n_components=1)]","0.0013325559993973","0.0036443440039874",0.0023117880045901004,2.7348524231894915
"test_can_persist_fitted[GaussianProcessClassifier()]","0.003662921997602","0.0100116180110489",0.006348696013446899,2.733232653494448
"test_can_persist_fitted[GaussianNB()]","0.001269375992706","0.0034225059935124",0.0021531300008064,2.6962113772267364
"test_can_persist_fitted[SimpleImputer()]","0.0009062699973583","0.0024218929902417",0.0015156229928834,2.6723746756499853
"test_can_persist_fitted[NearestNeighbors()]","0.0009082900069188","0.002395991992671",0.0014877019857522,2.637915175131062
"test_can_persist_fitted[SpectralClustering(n_components=1)]","0.0127098130033118","0.0327692639984888",0.020059450995176996,2.5782648407140294
"test_can_persist_fitted[FactorAnalysis(n_components=1)]","0.0195348620036384","0.0497234249924076",0.030188562988769204,2.5453686329161953
"test_can_persist_fitted[TSNE(n_components=1)]","0.1255255159921944","0.317694390003453",0.19216887401125862,2.5309148302820628
"test_can_persist_fitted[LinearRegression()]","0.0009793620120035","0.002405147999525",0.0014257859875214998,2.455831418869047
"test_can_persist_fitted[GraphicalLasso()]","0.0086081100016599","0.0204216620040824",0.011813552002422501,2.3723746560097974
"test_can_persist_fitted[GaussianProcessRegressor()]","0.0004234910011291","0.0009836230019573",0.0005601320008282001,2.3226538446738934
"test_can_persist_fitted[KernelRidge()]","0.0008906929870136","0.0020350589911686",0.001144366004155,2.2848041029175934
"test_can_persist_fitted[FeatureHasher()]","0.0009295619965996","0.0020383999944897",0.0011088379978901,2.1928607257464305
"test_can_persist_fitted[HistGradientBoostingRegressor()]","0.0203921549982624","0.0434060730040073",0.0230139180057449,2.1285672361604693
"test_can_persist_fitted[MeanShift()]","0.0483692080015316","0.1026678279886255",0.054298619987093906,2.122586501424099
"test_can_persist_fitted[BayesianRidge()]","0.0014079749962547","0.0029236859991215",0.0015157110028668,2.0765184089907023
"test_can_persist_fitted[LabelBinarizer()]","0.0010816889989655","0.0022351079969666",0.0011534189980011,2.066312959736302
"test_can_persist_fitted[OneVsOneClassifier(estimator=LogisticRegression(C=1))]","0.0035561710101319","0.0072453939937986",0.0036892229836667,2.0374143912527605
"test_can_persist_fitted[EllipticEnvelope()]","0.0378726820053998","0.0719431110046571",0.034070428999257295,1.89960433735323
"test_can_persist_fitted[SGDRegressor()]","0.0010731799993664","0.0020019400108139",0.0009287600114474999,1.8654279915725553
"test_can_persist_fitted[RANSACRegressor(estimator=LinearRegression())]","0.0711863120086491","0.1266435039869975",0.055457191978348405,1.7790429144806714
"test_can_persist_fitted[MinCovDet()]","0.0332818409951869","0.0540667439927347",0.020784902997547802,1.624511817136367
"test_can_persist_fitted[DBSCAN()]","0.0011594509996939","0.0018382370035396",0.0006787860038457,1.5854374216977711
"test_can_persist_fitted[SpectralEmbedding(n_components=1)]","0.0044372770062182","0.0070096690033096",0.0025723919970913993,1.5797231034903985
"test_can_persist_fitted[GradientBoostingClassifier()]","0.0647526280081365","0.1017985090002184",0.037045880992081906,1.5721139377914808
"test_can_persist_fitted[BayesianGaussianMixture()]","0.0038830019911983","0.0060393379972083",0.00215633600601,1.5553270410104918
"test_can_persist_fitted[PowerTransformer()]","0.0224101670028176","0.0346972039988031",0.0122870369959855,1.5482795819611994
"test_can_persist_fitted[RidgeClassifierCV()]","0.0021108439977979","0.0031720449915155",0.0010612009937176,1.5027377650004825
"test_can_persist_fitted[VarianceThreshold()]","0.0008643930050311","0.0012846210011048",0.0004202279960737,1.4861538601397875
"test_can_persist_fitted[SparsePCA(n_components=1)]","0.0867362350109033","0.127830443001585",0.0410942079906817,1.4737836267105195
"test_can_persist_fitted[LassoCV()]","0.0380988410033751","0.0551571569958468",0.0170583159924717,1.4477384493391947
"test_can_persist_fitted[EmpiricalCovariance()]","0.0010117939964402","0.0014475229982053",0.00043572900176509994,1.4306499181633094
"test_can_persist_fitted[OneHotEncoder()]","0.0007435950101353","0.0010595619969535",0.00031596698681820006,1.4249181106805822
"test_can_persist_fitted[TfidfVectorizer()]","0.0013325569889275","0.0018945149931823",0.0005619580042548001,1.4217140496986087
"test_can_persist_fitted[MinMaxScaler()]","0.0007294279930647","0.0010341020097257",0.00030467401666099995,1.417688955671839
"test_can_persist_fitted[TfidfTransformer()]","0.0012206079991301","0.0017198150017065",0.0004992070025764,1.408982247316234
"test_can_persist_fitted[CCA(n_components=1)]","0.0010862969938898","0.001518039003713",0.00043174200982320013,1.3974438042742099
"test_can_persist_fitted[ARDRegression()]","0.0126483920030295","0.0176656460098456",0.0050172540068161,1.3966712927314702
"test_can_persist_fitted[OneVsRestClassifier(estimator=LogisticRegression(C=1))]","0.0039936749963089","0.0055577759922016",0.0015641009958926996,1.3916445372591157
"test_can_persist_fitted[HuberRegressor()]","0.0107131620025029","0.0145136320061283",0.003800470003625399,1.3547477395317555
"test_can_persist_fitted[Ridge()]","0.0006361050036503","0.0008559510024497",0.00021984599879940005,1.345612748740868
"test_can_persist_fitted[FunctionTransformer(func=<ufunc'erf'>,inverse_func=<ufunc'erfinv'>)]","0.0007440420013153","0.0009982040064642",0.0002541620051489,1.341596314051624
"test_can_persist_fitted[PoissonRegressor()]","0.0055465689947595","0.0073421239940216",0.0017955549992621006,1.3237235489107904
"test_can_persist_fitted[FunctionTransformer(func=functools.partial(<ufunc'add'>,10),inverse_func=functools.partial(<ufunc'add'>,-10))]","0.0006530280079459","0.0008636220009066",0.0002105939929607,1.322488454397421
"test_can_persist_fitted[KernelPCA(n_components=1)]","0.001298568007769","0.0017092789930757",0.00041071098530670006,1.316279919765096
"test_can_persist_fitted[GraphicalLassoCV()]","0.3661585500085493","0.481569366005715",0.11541081599716568,1.3151935575298488
"test_can_persist_fitted[VotingRegressor(estimators=[('est1',Ridge(alpha=0.1)),('est2',Ridge(alpha=1))])]","0.0016161160019692","0.0021203890064498",0.0005042730044806001,1.3120277281248098
"test_can_persist_fitted[MissingIndicator()]","0.0006886129995109","0.0008854990010149",0.000196886001504,1.2859167655037618
"test_can_persist_fitted[OneClassSVM()]","0.0011959840048803","0.0015293489996111",0.0003333649947308002,1.2787370009719863
"test_can_persist_fitted[DecisionTreeRegressor()]","0.0012525390047812","0.0015977739967638",0.00034523499198260005,1.2756281366606284
"test_can_persist_fitted[LabelEncoder()]","0.0016270780033664","0.0020700199966086",0.00044294199324220016,1.272231566234538
"test_can_persist_fitted[ShrunkCovariance()]","0.0010790710075525","0.0013700450072064",0.00029097399965389995,1.2696523190942495
"test_can_persist_fitted[SVR()]","0.0008788159902906","0.0011090990010416",0.0002302830107510001,1.2620378023331733
"test_can_persist_fitted[AdaBoostClassifier()]","0.050940952001838","0.0637439109996194",0.012802958997781402,1.2513294018792476
"test_can_persist_fitted[SelectPercentile()]","0.0009721020032884","0.0012072280078427",0.00023512600455430008,1.2418737990035225
"test_can_persist_fitted[KernelCenterer()]","0.0005867239960934","0.0007275149982888",0.00014079100219540003,1.2399612136759917
"test_can_persist_fitted[MultinomialNB()]","0.0012180370104033","0.0015100150048965",0.00029197799449320015,1.2397119233647296
"test_can_persist_fitted[RadiusNeighborsClassifier()]","0.0008196080016205","0.0010090029973071",0.00018939499568659997,1.2310799739779685
"test_can_persist_fitted[RadiusNeighborsTransformer()]","0.0006537840090459","0.0007985830015968",0.0001447989925509,1.2214783331305585
"test_can_persist_fitted[CalibratedClassifierCV(estimator=LogisticRegression(C=1))]","0.0218348740017972","0.0265728600061265",0.0047379860043293,1.2169916805537473
"test_can_persist_fitted[AdaBoostRegressor()]","0.0465619070018874","0.0561594290047651",0.009597522002877702,1.2061239030112891
"test_can_persist_fitted[VotingClassifier(estimators=[('est1',LogisticRegression(C=0.1)),('est2',LogisticRegression(C=1))])]","0.0065736309916246","0.0079231550043914",0.0013495240127668002,1.2052935454524625
"test_can_persist_fitted[HashingVectorizer()]","0.0007064819947117","0.0008509629988111",0.0001444810040994001,1.204507694719608
"test_can_persist_fitted[BernoulliNB()]","0.0016057890024967","0.0019301649881526",0.0003243759856559,1.2020041145826483
"test_can_persist_fitted[QuadraticDiscriminantAnalysis()]","0.001282765995711","0.0015390229964395",0.00025625700072850013,1.1997690939620396
"test_can_persist_fitted[LedoitWolf()]","0.0011327229876769","0.001345967000816",0.00021324401313910007,1.188257866626722
"test_can_persist_fitted[PLSCanonical(n_components=1)]","0.0008930790063459","0.0010565039992798",0.00016342499293390004,1.182990521300647
"test_can_persist_fitted[SVC()]","0.0013242099958006","0.0015611440030625",0.0002369340072618999,1.1789247989467506
"test_can_persist_fitted[OrdinalEncoder()]","0.0007790569943608","0.0009178610052913",0.00013880401093050007,1.1781692635265868
"test_can_persist_fitted[MiniBatchSparsePCA(n_components=1)]","0.5331204669928411","0.6277459029952297",0.0946254360023886,1.177493534502886
"test_can_persist_fitted[RidgeCV()]","0.0010370239906478","0.0012171739945188",0.0001801500038709999,1.173718260614651
"test_can_persist_fitted[LogisticRegressionCV()]","0.1866729580069659","0.2189319430035539",0.032258984996588,1.1728101667269033
"test_can_persist_fitted[ComplementNB()]","0.0012564180069603","0.0014726260124007",0.00021620800544039994,1.1720828611518233
"test_can_persist_fitted[StackingClassifier(estimators=[('est1',LogisticRegression(C=0.1)),('est2',LogisticRegression(C=1))])]","0.0341543770045973","0.0400117379904259",0.005857360985828598,1.1714966425837654
"test_can_persist_fitted[ExtraTreesClassifier()]","0.075037741989945","0.0878974350052885",0.012859693015343496,1.1713763324203796
"test_can_persist_fitted[KernelDensity()]","0.0007219630060717","0.0008428259898209",0.00012086298374919995,1.1674088322154235
"test_can_persist_fitted[ExtraTreeClassifier()]","0.0011761259956983","0.0013658559910254",0.00018972999532710006,1.1613177465858595
"test_can_persist_fitted[RidgeClassifier()]","0.0017092100024456","0.0019844030030071",0.0002751930005614998,1.161005961916759
"test_can_persist_fitted[LassoLarsCV()]","0.0119811650074552","0.0138928539963671",0.0019116889889119002,1.1595578549934304
"test_can_persist_fitted[MultiOutputClassifier(estimator=LogisticRegression(C=1))]","0.0032788190001156","0.0037978430045768",0.0005190240044612,1.1582960219648908
"test_can_persist_fitted[SelfTrainingClassifier(base_estimator=LogisticRegression(C=1))]","0.0034496400039643","0.0039106769982026",0.0004610369942382995,1.133647857083197
"test_can_persist_fitted[HalvingRandomSearchCV(estimator=LogisticRegression(random_state=0,solver='liblinear'),param_distributions={'C':[1,2,3,4,5]})]","0.0186055730009684","0.0209051120036747",0.0022995390027063,1.1235940974559941
"test_can_persist_fitted[RobustScaler()]","0.0028357779956422","0.0031639569933759",0.00032817899773370006,1.1157280288647489
"test_can_persist_fitted[RFE(estimator=LogisticRegression(C=1))]","0.0287706700037233","0.0319507169915596",0.003180046987836301,1.1105308631124948
"test_can_persist_fitted[RandomForestRegressor()]","0.1025792099972022","0.1136259829945629",0.011046772997360704,1.1076901742337653
"test_can_persist_fitted[KNeighborsRegressor()]","0.0005174600082682","0.0005709969991585",5.353699089030001e-05,1.1034611178349298
"test_can_persist_fitted[KNeighborsClassifier(algorithm='kd_tree')]","0.000879220009665","0.0009664180106483",8.719800098329995e-05,1.099176542872954
"test_can_persist_fitted[LassoLars()]","0.0025726489984663","0.0028255540091777",0.00025290501071139997,1.0983052918848124
"test_can_persist_fitted[MultiTaskElasticNet()]","0.0007665879966225","0.0008397030032938",7.311500667130002e-05,1.09537718695497
"test_can_persist_fitted[Pipeline(steps=[('features',FeatureUnion(transformer_list=[('scaler',StandardScaler()),('scaled-poly',Pipeline(steps=[('polys',FeatureUnion(transformer_list=[('poly1',PolynomialFeatures()),('poly2',PolynomialFeatures(degree=3,include_bias=False))])),('scale',MinMaxScaler())]))])),('clf',LogisticRegression(random_state=0,solver='liblinear'))])]","0.0157648290041834","0.0171720850048586",0.0014072560006751986,1.0892655416878778
"test_can_persist_fitted[HalvingGridSearchCV(estimator=LogisticRegression(random_state=0,solver='liblinear'),param_grid={'C':[1,2,3,4,5]})]","0.0417294619983295","0.0453058139974018",0.0035763519990723025,1.0857032855879012
"test_can_persist_fitted[PCA(n_components=1)]","0.0010547990095801","0.0011448959994595",9.009698987939982e-05,1.085416263251201
"test_can_persist_fitted[PLSSVD(n_components=1)]","0.0008858310029609","0.0009581610065652",7.233000360430003e-05,1.0816521473763463
"test_can_persist_fitted[IncrementalPCA(n_components=1)]","0.001100387002225","0.0011889339948538",8.854699262880001e-05,1.0804689554218259
"test_can_persist_fitted[RandomizedSearchCV(estimator=LogisticRegression(random_state=0,solver='liblinear'),n_iter=3,param_distributions={'C':[1,2,3,4,5]})]","0.0204526760062435","0.0220905689930077",0.0016378929867642,1.080082087364226
"test_can_persist_fitted[RBFSampler(n_components=1)]","0.0007984279945958","0.0008596959960414",6.12680014456e-05,1.0767357881490824
"test_can_persist_fitted[BaggingRegressor()]","0.0125537710118805","0.0134970329963834",0.0009432619845029001,1.0751377401746636
"test_can_persist_fitted[OutputCodeClassifier(estimator=LogisticRegression(C=1))]","0.0042471040069358","0.0045657730079256",0.0003186690009898,1.0750320690214774
"test_can_persist_fitted[MiniBatchKMeans()]","0.0078272259997902","0.0084100420062895",0.0005828160064992993,1.074460096912357
"test_can_persist_fitted[LatentDirichletAllocation(n_components=1)]","0.0174797929939813","0.0187050800013821",0.0012252870074008007,1.0700973408450944
"test_can_persist_fitted[ClassifierChain(base_estimator=LogisticRegression(C=1))]","0.003608583996538","0.0038580209948122",0.00024943699827419986,1.069123234629845
"test_can_persist_fitted[DictionaryLearning(n_components=1)]","0.0252839390013832","0.0269514709943905",0.0016675319930072978,1.0659522233824434
"test_can_persist_fitted[AdditiveChi2Sampler()]","0.0006624880043091","0.0007051800057524",4.2692001443300005e-05,1.0644419237263367
"test_can_persist_fitted[AffinityPropagation()]","0.003210470007616","0.003386052994756",0.00017558298714000003,1.0546907420793452
"test_can_persist_fitted[MultiTaskLassoCV()]","0.0190663599933031","0.020108753000386",0.0010423930070828993,1.054671841266452
"test_can_persist_fitted[SGDClassifier()]","0.0014912049955455","0.0015719160001026",8.071100455709994e-05,1.0541246876171944
"test_can_persist_fitted[DummyClassifier()]","0.0007533600000897","0.000793806000729",4.04460006393e-05,1.0536874809314063
"test_can_persist_fitted[StackingRegressor(estimators=[('est1',Ridge(alpha=0.1)),('est2',Ridge(alpha=1))])]","0.0102079740026965","0.010739988007117",0.0005320140044205012,1.0521174920978411
"test_can_persist_fitted[MiniBatchDictionaryLearning(n_components=1)]","5.44541486199887","5.713369516000967",0.2679546540020974,1.0492073902159473
"test_can_persist_fitted[DictVectorizer()]","0.0007831640104996","0.0008214319968828",3.826798638319998e-05,1.0488633107116194
"test_can_persist_fitted[SequentialFeatureSelector(estimator=LogisticRegression(C=1))]","1.5951796029985417","1.671207699997467",0.07602809699892532,1.0476611516697
"test_can_persist_fitted[RandomTreesEmbedding()]","0.0665871059900382","0.0697572490025777",0.0031701430125394975,1.0476089622067937
"test_can_persist_fitted[RFECV(estimator=LogisticRegression(C=1))]","0.2849091190000763","0.2977122179872822",0.012803098987205885,1.0449374840375063
"test_can_persist_fitted[IsolationForest()]","0.0864064729976235","0.0902635519887553",0.0038570789911318015,1.0446387736626848
"test_can_persist_fitted[MLPRegressor()]","0.0537431749980896","0.0561026689974824",0.002359493999392795,1.0439031374584153
"test_can_persist_fitted[KNNImputer()]","0.1559758450021036","0.1627859479922335",0.006810102990129907,1.043661266845761
"test_can_persist_fitted[ColumnTransformer(transformers=[('norm1',Normalizer(norm='l1'),[0]),('norm2',Normalizer(norm='l1'),[1,2]),('norm3',Normalizer(norm='l1'),[True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False]),('norm4',Normalizer(norm='l1'),array([1,2])),('norm5',Normalizer(norm='l1'),slice(None,3,None)),('norm6',Normalizer(norm='l1'),slice(-10,-3,2))])]","0.0029084190027788","0.0030230859993025",0.00011466699652370018,1.039425886165007
"test_can_persist_fitted[RegressorChain(base_estimator=Ridge())]","0.0012361900007817","0.0012826549937017",4.646499291999988e-05,1.0375872583426642
"test_can_persist_fitted[ElasticNetCV()]","0.0392434490058803","0.0406295399880036",0.001386090982123299,1.0353203150394759
"test_can_persist_fitted[SGDOneClassSVM()]","0.0011231740063522","0.0011595130054047",3.6338999052499925e-05,1.0323538461956756
"test_can_persist_fitted[CategoricalNB()]","0.0025532580038998","0.0026260879967594",7.282999285960004e-05,1.0285243374341178
"test_can_persist_fitted[RandomForestClassifier()]","0.0921416700002737","0.0944151160074397",0.0022734460071659884,1.0246733753269204
"test_can_persist_fitted[KNeighborsRegressor(algorithm='ball_tree')]","0.0005623739998554","0.00057624198962",1.3867989764600012e-05,1.0246597278113245
"test_can_persist_fitted[GridSearchCV(estimator=LogisticRegression(random_state=0,solver='liblinear'),param_grid={'C':[1,2,3,4,5]})]","0.03257500899781","0.0333471889898646",0.000772179992054603,1.023704674712646
"test_can_persist_fitted[SelectFpr()]","0.0012472069938667","0.0012763069971697",2.910000330300002e-05,1.0233321360817436
"test_can_persist_fitted[PLSRegression(n_components=1)]","0.0008168109925463","0.0008356059988727",1.879500632639996e-05,1.023010226965493
"test_can_persist_fitted[TheilSenRegressor()]","0.627523786999518","0.6413168939907337",0.013793106991215609,1.0219802137814837
"test_can_persist_fitted[TruncatedSVD(n_components=1)]","0.0022353439999278","0.0022775029938202",4.2158993892399844e-05,1.0188601816515765
"test_can_persist_fitted[MLPClassifier()]","0.0623257219995139","0.0634916169947246",0.0011658949952106923,1.018706481975769
"test_can_persist_fitted[MaxAbsScaler()]","0.0007455649902112","0.0007583139959024",1.2749005691199949e-05,1.0170997912436694
"test_can_persist_fitted[MultiTaskElasticNetCV()]","0.0171599489985965","0.0174205939983949",0.00026064499979840117,1.0151891476961685
"test_can_persist_fitted[FunctionTransformer(func=<ufunc'sqrt'>,inverse_func=<ufunc'square'>)]","0.0007868840039009","0.0007969470025273",1.0062998626400024e-05,1.012788414272642
"test_can_persist_fitted[OrthogonalMatchingPursuitCV()]","0.0035778960009338","0.0036197010049363",4.180500400249995e-05,1.0116842423568457
"test_can_persist_fitted[CountVectorizer()]","0.0009604619990568","0.0009688299905974",8.36799154060007e-06,1.0087124649895756
"test_can_persist_fitted[KNeighborsTransformer()]","0.000647385008051","0.0006524830096168",5.098001565800045e-06,1.0078747599996916
"test_can_persist_fitted[PolynomialFeatures()]","0.0009139189933193","0.0009180089982692",4.090004949900078e-06,1.00447523793662
"test_can_persist_fitted[PassiveAggressiveClassifier()]","0.0012273150059627","0.0012305720010772",3.256995114500009e-06,1.002653756451014
"test_can_persist_fitted[ExtraTreesRegressor()]","0.0723351300111971","0.0724053549929522",7.02249817551015e-05,1.0009708281680594
"test_can_persist_fitted[LabelSpreading()]","0.0034299719991395","0.0034272470074938",-2.724991645699972e-06,0.9992055353086312
"test_can_persist_fitted[SparseRandomProjection(n_components=1)]","0.0010185150022152","0.0010163560073124",-2.1589949028000526e-06,0.9978802522318234
"test_can_persist_fitted[LassoLarsIC()]","0.003475163000985","0.0034607590059749",-1.4403995010099993e-05,0.9958551598857327
"test_can_persist_fitted[OrthogonalMatchingPursuit()]","0.000884089997271","0.0008785029931459",-5.587004125099933e-06,0.9936805029551903
"test_can_persist_fitted[SelectFromModel(estimator=SGDRegressor(random_state=0))]","0.0013246059970697","0.0013142800016794",-1.0325995390299963e-05,0.9922044778499092
"test_can_persist_fitted[MultiLabelBinarizer()]","0.0006304230046225","0.0006242560048121",-6.166999810399993e-06,0.9902176796132419
"test_can_persist_fitted[StandardScaler()]","0.0008629170042695","0.0008531649946235",-9.752009645999952e-06,0.9886987860967515
"test_can_persist_fitted[SelectKBest()]","0.001191697010654","0.0011690020037349",-2.2695006919100152e-05,0.9809557238826627
"test_can_persist_fitted[BaggingClassifier()]","0.013520027991035","0.0131783289980376",-0.00034169899299739924,0.9747264581682836
"test_can_persist_fitted[MultiTaskLasso()]","0.0009197390027111","0.0008949609909905",-2.4778011720600008e-05,0.9730597358081344
"test_can_persist_fitted[ElasticNet()]","0.0009588749962858","0.0009323559934273",-2.6519002858500025e-05,0.9723436287720284
"test_can_persist_fitted[GradientBoostingRegressor()]","0.0507029959990177","0.0491985010012285",-0.0015044949977892005,0.9703272958896089
"test_can_persist_fitted[Perceptron()]","0.0013301419967319","0.0012839510018238",-4.619099490810012e-05,0.9652736361820097
"test_can_persist_fitted[SelectFdr()]","0.0012765760038746","0.0012155559961684",-6.10200077062e-05,0.9522002548058282
"test_can_persist_fitted[MultiOutputRegressor(estimator=Ridge())]","0.0010373830009484","0.0009802540007513",-5.7129000197100096e-05,0.9449296931366029
"test_can_persist_fitted[PatchExtractor(patch_size=(3,3))]","0.0252411669935099","0.0238435880019096",-0.0013975789916003019,0.9446309676585218
"test_can_persist_fitted[RadiusNeighborsRegressor()]","0.0006319329986581","0.0005849159933859",-4.7017005272199995e-05,0.9255981166167301
"test_can_persist_fitted[DecisionTreeClassifier()]","0.0020924089913023","0.0019315929966978",-0.0001608159946044998,0.9231431353655152
"test_can_persist_fitted[KNeighborsClassifier()]","0.0010117110068676","0.0009287019929615",-8.30090139061e-05,0.9179518525125988
"test_can_persist_fitted[DummyRegressor()]","0.0004487870028242","0.0004042410000693",-4.4546002754900004e-05,0.9007413261200221
"test_can_persist_fitted[LabelPropagation()]","0.0034579390048747","0.0031091869896044",-0.00034875201527030013,0.8991445439671839
"test_can_persist_fitted[AgglomerativeClustering()]","0.0040330769988941","0.0034665849962038",-0.0005664920026903003,0.8595385104609615
"test_can_persist_fitted[PassiveAggressiveRegressor()]","0.0009137890010606","0.0007824159984011",-0.00013137300265949996,0.8562326724145067
"test_can_persist_fitted[ExtraTreeRegressor()]","0.0013952790031908","0.0010076239996124",-0.00038765500357839993,0.722166675846272
"test_can_persist_fitted[TransformedTargetRegressor()]","0.0022386700002243","0.0015261009975802",-0.0007125690026441001,0.6816998474215916
"test_can_persist_fitted[MDS(n_components=1)]","0.0108395830029621","0.0067648569965967",-0.004074726006365399,0.6240883062335597
"test_can_persist_fitted[PolynomialCountSketch(n_components=1)]","0.0022807060013292","0.0012844319862779",-0.0009962740150513002,0.5631729760562433
"test_can_persist_fitted[SelectFwe()]","0.0018083500035572","0.0009522119944449",-0.0008561380091122999,0.5265639906941724
"test_can_persist_fitted[SparseCoder(dictionary=array([[-2.,-1.,2.,0.,2.,-2.,1.,-2.,0.,0.,-1.,0.,2.,-2.,1.,0.,2.,1.,0.,-2.],[2.,1.,-2.,1.,1.,0.,-2.,-2.,0.,1.,-2.,2.,0.,-2.,1.,-1.,0.,1.,0.,-1.],[1.,0.,-1.,0.,-2.,1.,-2.,1.,1.,-2.,1.,-2.,0.,1.,-1.,1.,-2.,2.,-1.,1.],[1.,-1.,-1.,0.,-2.,1.,-2.,2.,0.,0.,-2.,0.,0.,-1.,2.,2.,-2.,-1.,-2.,1.],[0.,1.,2.,-2.,-2.,-1.,2.,-1.,-2.,-2.,0.,1.,2.,0.,0.,2.,-1.,2.,-1.,1.]]),transform_algorithm='lasso_lars')]","0.0005894329951843","","",""
"test_can_persist_fitted[SparseCoder(dictionary=array([[2.,-1.,0.,1.,-2.,-1.,-2.,2.,-2.,2.,2.,2.,1.,0.,2.,2.,-1.,2.,0.,2.],[-2.,-1.,0.,-2.,-1.,2.,0.,-1.,1.,-1.,0.,-2.,-2.,-1.,0.,2.,-2.,-1.,0.,1.],[-1.,-1.,-1.,2.,0.,1.,1.,2.,-2.,-1.,2.,1.,1.,1.,-1.,0.,-1.,0.,0.,2.],[1.,1.,2.,0.,-2.,0.,2.,1.,-1.,-2.,1.,1.,-1.,2.,0.,-1.,0.,-1.,-2.,0.],[2.,-2.,0.,2.,0.,1.,-2.,2.,-1.,-1.,0.,-1.,-1.,0.,-1.,-1.,-1.,2.,-1.,-1.]]),transform_algorithm='lasso_lars')]","","0.000741170006222","",""
```

</details>

I have a `Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz` with hyperthreading enabled.

cc @jjerphan @ogrisel

Environment details:

<details>

```bash
$ mmamba list
List of packages in environment: "/home/adrin/miniforge3/envs/skops"

  Name                           Version      Build                Channel    
────────────────────────────────────────────────────────────────────────────────
  _libgcc_mutex                  0.1          conda_forge          conda-forge
  _openmp_mutex                  4.5          2_gnu                conda-forge
  _py-xgboost-mutex              2.0          cpu_0                conda-forge
  alabaster                      0.7.12       py_0                 conda-forge
  argon2-cffi                    21.3.0       pyhd8ed1ab_0         conda-forge
  argon2-cffi-bindings           21.2.0       py310h5764c6d_2      conda-forge
  asttokens                      2.0.8        pyhd8ed1ab_0         conda-forge
  attrs                          22.1.0       pyh71513ae_1         conda-forge
  babel                          2.10.3       pyhd8ed1ab_0         conda-forge
  backcall                       0.2.0        pyh9f0ad1d_0         conda-forge
  backports                      1.0          py_2                 conda-forge
  backports.functools_lru_cache  1.6.4        pyhd8ed1ab_0         conda-forge
  beautifulsoup4                 4.11.1       pyha770c72_0         conda-forge
  binutils                       2.36.1       hdd6e379_2           conda-forge
  binutils_impl_linux-64         2.36.1       h193b22a_2           conda-forge
  binutils_linux-64              2.36         hf3e587d_10          conda-forge
  black                          22.8.0       py310hff52083_0      conda-forge
  bleach                         5.0.1        pyhd8ed1ab_0         conda-forge
  brotli                         1.0.9        h166bdaf_7           conda-forge
  brotli-bin                     1.0.9        h166bdaf_7           conda-forge
  brotlipy                       0.7.0        py310h5764c6d_1004   conda-forge
  bzip2                          1.0.8        h7f98852_4           conda-forge
  c-compiler                     1.5.2        h0b41bf4_0           conda-forge
  ca-certificates                2022.12.7    ha878542_0           conda-forge
  certifi                        2022.12.7    pyhd8ed1ab_0         conda-forge
  cffi                           1.15.1       py310h255011f_0      conda-forge
  cfgv                           3.3.1        pyhd8ed1ab_0         conda-forge
  charset-normalizer             2.1.1        pyhd8ed1ab_0         conda-forge
  click                          8.1.3        py310hff52083_0      conda-forge
  cmarkgfm                       0.8.0        py310h5764c6d_1      conda-forge
  colorama                       0.4.5        pyhd8ed1ab_0         conda-forge
  commonmark                     0.9.1        py_0                 conda-forge
  compilers                      1.5.2        ha770c72_0           conda-forge
  contourpy                      1.0.5        py310hbf28c38_0      conda-forge
  cryptography                   38.0.4       py310h600f1e7_0      conda-forge
  cxx-compiler                   1.5.2        hf52228f_0           conda-forge
  cycler                         0.11.0       pyhd8ed1ab_0         conda-forge
  cython                         0.29.33      py310heca2aa9_0      conda-forge
  daal4py                        2023.0.2     py310hd3e5ea5_0      conda-forge
  dal                            2023.0.1     ha770c72_26648       conda-forge
  dataclasses                    0.8          pyhc8e2a94_3         conda-forge
  dbus                           1.13.6       h5008d03_3           conda-forge
  debugpy                        1.6.3        py310hd8f1fbe_0      conda-forge
  decorator                      5.1.1        pyhd8ed1ab_0         conda-forge
  defusedxml                     0.7.1        pyhd8ed1ab_0         conda-forge
  distlib                        0.3.5        pyhd8ed1ab_0         conda-forge
  docutils                       0.19         py310hff52083_0      conda-forge
  entrypoints                    0.4          pyhd8ed1ab_0         conda-forge
  execnet                        1.9.0        pyhd8ed1ab_0         conda-forge
  executing                      1.1.0        pyhd8ed1ab_0         conda-forge
  expat                          2.4.9        h27087fc_0           conda-forge
  filelock                       3.8.0        pyhd8ed1ab_0         conda-forge
  flaky                          3.7.0        pyh9f0ad1d_0         conda-forge
  flit-core                      3.7.1        pyhd8ed1ab_0         conda-forge
  fonttools                      4.37.3       py310h5764c6d_0      conda-forge
  fortran-compiler               1.5.2        hdb1a99f_0           conda-forge
  freetype                       2.12.1       hca18f0e_0           conda-forge
  future                         0.18.2       py310hff52083_5      conda-forge
  gcc                            11.3.0       h02d0930_11          conda-forge
  gcc_impl_linux-64              11.3.0       haf7caf2_17          conda-forge
  gcc_linux-64                   11.3.0       he6f903b_10          conda-forge
  gettext                        0.19.8.1     h27087fc_1009        conda-forge
  gfortran                       11.3.0       ha859ce3_11          conda-forge
  gfortran_impl_linux-64         11.3.0       he34c6f7_19          conda-forge
  gfortran_linux-64              11.3.0       h3c55166_10          conda-forge
  giflib                         5.2.1        h36c2ea0_2           conda-forge
  gxx                            11.3.0       h02d0930_11          conda-forge
  gxx_impl_linux-64              11.3.0       haf7caf2_17          conda-forge
  gxx_linux-64                   11.3.0       hc203a17_10          conda-forge
  huggingface_hub                0.12.1       pyhd8ed1ab_0         conda-forge
  icu                            70.1         h27087fc_0           conda-forge
  identify                       2.5.5        pyhd8ed1ab_0         conda-forge
  idna                           3.4          pyhd8ed1ab_0         conda-forge
  imagesize                      1.4.1        pyhd8ed1ab_0         conda-forge
  importlib-metadata             4.11.4       py310hff52083_0      conda-forge
  importlib_metadata             4.11.4       hd8ed1ab_0           conda-forge
  importlib_resources            5.9.0        pyhd8ed1ab_0         conda-forge
  iniconfig                      1.1.1        pyh9f0ad1d_0         conda-forge
  ipykernel                      6.16.0       pyh210e3f2_0         conda-forge
  ipython                        8.5.0        pyh41d4057_1         conda-forge
  ipython_genutils               0.2.0        py_1                 conda-forge
  ipywidgets                     8.0.2        pyhd8ed1ab_1         conda-forge
  jaraco.classes                 3.2.2        pyhd8ed1ab_0         conda-forge
  jbig                           2.1          h7f98852_2003        conda-forge
  jedi                           0.18.1       pyhd8ed1ab_2         conda-forge
  jeepney                        0.8.0        pyhd8ed1ab_0         conda-forge
  jinja2                         3.1.2        pyhd8ed1ab_1         conda-forge
  joblib                         1.2.0        pyhd8ed1ab_0         conda-forge
  jpeg                           9e           h166bdaf_2           conda-forge
  jsonschema                     4.16.0       pyhd8ed1ab_0         conda-forge
  jupyter_client                 7.3.5        pyhd8ed1ab_0         conda-forge
  jupyter_core                   4.11.1       py310hff52083_0      conda-forge
  jupyterlab_pygments            0.2.2        pyhd8ed1ab_0         conda-forge
  jupyterlab_widgets             3.0.3        pyhd8ed1ab_0         conda-forge
  kernel-headers_linux-64        2.6.32       he073ed8_15          conda-forge
  keyring                        23.9.3       py310hff52083_0      conda-forge
  kiwisolver                     1.4.4        py310hbf28c38_0      conda-forge
  lcms2                          2.12         hddcbb42_0           conda-forge
  ld_impl_linux-64               2.36.1       hea4e1c9_2           conda-forge
  lerc                           4.0.0        h27087fc_0           conda-forge
  libblas                        3.9.0        16_linux64_openblas  conda-forge
  libbrotlicommon                1.0.9        h166bdaf_7           conda-forge
  libbrotlidec                   1.0.9        h166bdaf_7           conda-forge
  libbrotlienc                   1.0.9        h166bdaf_7           conda-forge
  libcblas                       3.9.0        16_linux64_openblas  conda-forge
  libdeflate                     1.14         h166bdaf_0           conda-forge
  libffi                         3.4.2        h7f98852_5           conda-forge
  libgcc-devel_linux-64          11.3.0       h16e4278_17          conda-forge
  libgcc-ng                      12.1.0       h8d9b700_16          conda-forge
  libgfortran-ng                 12.1.0       h69a702a_16          conda-forge
  libgfortran5                   12.1.0       hdcd56e2_16          conda-forge
  libglib                        2.74.0       h7a41b64_0           conda-forge
  libgomp                        12.1.0       h8d9b700_16          conda-forge
  libhwloc                       2.8.0        h32351e8_1           conda-forge
  libiconv                       1.17         h166bdaf_0           conda-forge
  liblapack                      3.9.0        16_linux64_openblas  conda-forge
  libnsl                         2.0.0        h7f98852_0           conda-forge
  libopenblas                    0.3.21       pthreads_h78a6416_3  conda-forge
  libpng                         1.6.38       h753d276_0           conda-forge
  libsanitizer                   11.3.0       hd8f1017_17          conda-forge
  libsodium                      1.0.18       h36c2ea0_1           conda-forge
  libsqlite                      3.39.3       h753d276_0           conda-forge
  libstdcxx-devel_linux-64       11.3.0       h16e4278_17          conda-forge
  libstdcxx-ng                   12.1.0       ha89aaad_16          conda-forge
  libtiff                        4.4.0        h55922b4_4           conda-forge
  libuuid                        2.32.1       h7f98852_1000        conda-forge
  libwebp                        1.2.4        h522a892_0           conda-forge
  libwebp-base                   1.2.4        h166bdaf_0           conda-forge
  libxcb                         1.13         h7f98852_1004        conda-forge
  libxgboost                     1.7.1        cpu_ha3b9936_0       conda-forge
  libxml2                        2.10.2       h4c7fe37_1           conda-forge
  libxslt                        1.1.35       h8affb1d_0           conda-forge
  libzlib                        1.2.12       h166bdaf_3           conda-forge
  lxml                           4.9.1        py310h5764c6d_0      conda-forge
  lz4-c                          1.9.3        h9c3ff4c_1           conda-forge
  markupsafe                     2.1.1        py310h5764c6d_1      conda-forge
  matplotlib-base                3.6.0        py310h8d5ebf3_0      conda-forge
  matplotlib-inline              0.1.6        pyhd8ed1ab_0         conda-forge
  mistune                        2.0.4        pyhd8ed1ab_0         conda-forge
  more-itertools                 8.14.0       pyhd8ed1ab_0         conda-forge
  mpi                            1.0          mpich                conda-forge
  mpich                          4.0.3        h846660c_100         conda-forge
  munkres                        1.1.4        pyh9f0ad1d_0         conda-forge
  mypy_extensions                0.4.3        py310hff52083_5      conda-forge
  nbclient                       0.6.8        pyhd8ed1ab_0         conda-forge
  nbconvert                      7.0.0        pyhd8ed1ab_0         conda-forge
  nbconvert-core                 7.0.0        pyhd8ed1ab_0         conda-forge
  nbconvert-pandoc               7.0.0        pyhd8ed1ab_0         conda-forge
  nbformat                       5.6.1        pyhd8ed1ab_0         conda-forge
  ncurses                        6.3          h27087fc_1           conda-forge
  nest-asyncio                   1.5.5        pyhd8ed1ab_0         conda-forge
  nodeenv                        1.7.0        pyhd8ed1ab_0         conda-forge
  notebook                       6.4.12       pyha770c72_0         conda-forge
  numpy                          1.23.3       py310h53a5b5f_0      conda-forge
  numpydoc                       1.4.0        pyhd8ed1ab_1         conda-forge
  openjpeg                       2.5.0        h7d73246_1           conda-forge
  openssl                        3.0.7        h0b41bf4_1           conda-forge
  packaging                      21.3         pyhd8ed1ab_0         conda-forge
  pandas                         1.5.0        py310h769672d_0      conda-forge
  pandoc                         2.19.2       ha770c72_0           conda-forge
  pandocfilters                  1.5.0        pyhd8ed1ab_0         conda-forge
  parso                          0.8.3        pyhd8ed1ab_0         conda-forge
  pathspec                       0.10.1       pyhd8ed1ab_0         conda-forge
  pcre                           8.45         h9c3ff4c_0           conda-forge
  pcre2                          10.37        hc3806b6_1           conda-forge
  pexpect                        4.8.0        pyh9f0ad1d_2         conda-forge
  pickleshare                    0.7.5        py_1003              conda-forge
  pillow                         9.2.0        py310hbd86126_2      conda-forge
  pip                            22.2.2       pyhd8ed1ab_0         conda-forge
  pkginfo                        1.8.3        pyhd8ed1ab_0         conda-forge
  pkgutil-resolve-name           1.3.10       pyhd8ed1ab_0         conda-forge
  platformdirs                   2.5.2        pyhd8ed1ab_1         conda-forge
  pluggy                         1.0.0        py310hff52083_3      conda-forge
  pre-commit                     2.20.0       py310hff52083_0      conda-forge
  prometheus_client              0.14.1       pyhd8ed1ab_0         conda-forge
  prompt-toolkit                 3.0.31       pyha770c72_0         conda-forge
  psutil                         5.9.2        py310h5764c6d_0      conda-forge
  pthread-stubs                  0.4          h36c2ea0_1001        conda-forge
  ptyprocess                     0.7.0        pyhd3deb0d_0         conda-forge
  pure_eval                      0.2.2        pyhd8ed1ab_0         conda-forge
  py                             1.11.0       pyh6c4a22f_0         conda-forge
  py-xgboost                     1.7.1        cpu_py310hd1aba9c_0  conda-forge
  pycparser                      2.21         pyhd8ed1ab_0         conda-forge
  pygments                       2.13.0       pyhd8ed1ab_0         conda-forge
  pyopenssl                      22.0.0       pyhd8ed1ab_1         conda-forge
  pyparsing                      3.0.9        pyhd8ed1ab_0         conda-forge
  pyrsistent                     0.18.1       py310h5764c6d_1      conda-forge
  pysocks                        1.7.1        pyha2e5f31_6         conda-forge
  pytest                         7.1.3        py310hff52083_0      conda-forge
  pytest-forked                  1.4.0        pyhd8ed1ab_0         conda-forge
  pytest-xdist                   2.5.0        pyhd8ed1ab_0         conda-forge
  python                         3.10.6       ha86cf86_0_cpython   conda-forge
  python-dateutil                2.8.2        pyhd8ed1ab_0         conda-forge
  python-fastjsonschema          2.16.2       pyhd8ed1ab_0         conda-forge
  python_abi                     3.10         2_cp310              conda-forge
  pytz                           2022.2.1     pyhd8ed1ab_0         conda-forge
  pyyaml                         6.0          py310h5764c6d_4      conda-forge
  pyzmq                          24.0.1       py310h330234f_0      conda-forge
  readline                       8.1.2        h0f457ee_0           conda-forge
  readme_renderer                37.2         pyhd8ed1ab_0         conda-forge
  requests                       2.28.1       pyhd8ed1ab_1         conda-forge
  requests-toolbelt              0.9.1        py_0                 conda-forge
  rfc3986                        2.0.0        pyhd8ed1ab_0         conda-forge
  rich                           12.5.1       pyhd8ed1ab_0         conda-forge
  scikit-learn                   1.1.2        py310h0c3af53_0      conda-forge
  scikit-learn-intelex           2023.0.2     py310hff52083_0      conda-forge
  scipy                          1.9.1        py310hdfbd76f_0      conda-forge
  secretstorage                  3.3.3        py310hff52083_0      conda-forge
  send2trash                     1.8.0        pyhd8ed1ab_0         conda-forge
  setuptools                     65.4.0       pyhd8ed1ab_0         conda-forge
  six                            1.16.0       pyh6c4a22f_0         conda-forge
  snowballstemmer                2.2.0        pyhd8ed1ab_0         conda-forge
  soupsieve                      2.3.2.post1  pyhd8ed1ab_0         conda-forge
  sphinx                         5.2.2        pyhd8ed1ab_0         conda-forge
  sphinx-gallery                 0.11.1       pyhd8ed1ab_0         conda-forge
  sphinxcontrib-applehelp        1.0.2        py_0                 conda-forge
  sphinxcontrib-devhelp          1.0.2        py_0                 conda-forge
  sphinxcontrib-htmlhelp         2.0.0        pyhd8ed1ab_0         conda-forge
  sphinxcontrib-jsmath           1.0.1        py_0                 conda-forge
  sphinxcontrib-qthelp           1.0.3        py_0                 conda-forge
  sphinxcontrib-serializinghtml  1.1.5        pyhd8ed1ab_2         conda-forge
  sqlite                         3.39.3       h4ff8645_0           conda-forge
  stack_data                     0.5.1        pyhd8ed1ab_0         conda-forge
  sysroot_linux-64               2.12         he073ed8_15          conda-forge
  tbb                            2021.7.0     h924138e_1           conda-forge
  terminado                      0.16.0       pyh41d4057_0         conda-forge
  threadpoolctl                  3.1.0        pyh8a188c0_0         conda-forge
  tinycss2                       1.1.1        pyhd8ed1ab_0         conda-forge
  tk                             8.6.12       h27826a3_0           conda-forge
  toml                           0.10.2       pyhd8ed1ab_0         conda-forge
  tomli                          2.0.1        pyhd8ed1ab_0         conda-forge
  tornado                        6.2          py310h5764c6d_0      conda-forge
  tqdm                           4.64.1       pyhd8ed1ab_0         conda-forge
  traitlets                      5.4.0        pyhd8ed1ab_0         conda-forge
  twine                          4.0.1        pyhd8ed1ab_1         conda-forge
  typed-ast                      1.5.4        py310h5764c6d_0      conda-forge
  typing-extensions              4.3.0        hd8ed1ab_0           conda-forge
  typing_extensions              4.3.0        pyha770c72_0         conda-forge
  tzdata                         2022d        h191b570_0           conda-forge
  ukkonen                        1.0.1        py310hbf28c38_2      conda-forge
  unicodedata2                   14.0.0       py310h5764c6d_1      conda-forge
  urllib3                        1.26.11      pyhd8ed1ab_0         conda-forge
  virtualenv                     20.16.5      py310hff52083_0      conda-forge
  wcwidth                        0.2.5        pyh9f0ad1d_2         conda-forge
  webencodings                   0.5.1        py_1                 conda-forge
  wheel                          0.37.1       pyhd8ed1ab_0         conda-forge
  widgetsnbextension             4.0.3        pyhd8ed1ab_0         conda-forge
  xgboost                        1.7.1        cpu_py310hd1aba9c_0  conda-forge
  xorg-libxau                    1.0.9        h7f98852_0           conda-forge
  xorg-libxdmcp                  1.1.3        h7f98852_0           conda-forge
  xz                             5.2.6        h166bdaf_0           conda-forge
  yaml                           0.2.5        h7f98852_2           conda-forge
  zeromq                         4.3.4        h9c3ff4c_1           conda-forge
  zipp                           3.8.1        pyhd8ed1ab_0         conda-forge
  zlib                           1.2.12       h166bdaf_3           conda-forge
  zstd                           1.5.2        h6239696_4           conda-forge
```

</details>

COMMENT:
Possible action plan:

- try fitting `HistGradientBoostingClassifier` with a small logarithmic grid of n_samples between (100 and 1e6) and n_features (between 2 and 1000) and plot the scalability curves (fit duration vs OMP_NUM_THREADS in 1, 2, 4, 8, 16 on a machine with 16 physical cores or more)
- based on this, craft a heuristic to design an upper bound on `n_threads` based on `n_samples` / `n_features`.


Then repeat for other estimators in @adrinjalali's ranked list of worst offending estimators.

Labels: Performance