Skip to content

CLN: Make internal numpy sort and argsort use kind="stable" #53829

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 16 commits into from

Conversation

Charlie-XIAO
Copy link
Contributor

@Charlie-XIAO Charlie-XIAO commented Jun 24, 2023

In this PR I tried to find out all places where pandas internally uses np.sort() and np.argsort() and that kind="stable" may be necessary. In case I missed some of them, the following is a log of git grep for .sort( and .argsort(. Those marked with [y] are what I have changed and those marked with [n] are what I think does not need to be changed (e.g. list sort; sorting unique elements; kind can be specified). Those with no labels are tests and I made no changes to them, except that I have changed all kind="mergesort" to kind="stable" based on the "explicit better than implicit" principle.

git grep log

[y] pandas/_libs/algos.pyx:    result.sort()
[n] pandas/_libs/lib.pyx:            uniques.sort()
[n] pandas/_libs/lib.pyx:            uniques.sort()
[n] pandas/_testing/__init__.py:        values.sort()
[n] pandas/_testing/asserters.py:    assert_numpy_array_equal(seq, np.sort(np.array(seq)))
[y] pandas/core/algorithms.py:        npresult = np.sort(npresult)
[y] pandas/core/groupby/categorical.py:            take_codes = np.sort(take_codes)
[y] pandas/core/groupby/categorical.py:        unique_notnan_codes = np.sort(unique_notnan_codes)
[y] pandas/core/groupby/groupby.py:            indices = np.sort(np.concatenate(indices))
[y] pandas/core/groupby/grouper.py:                    ucodes = np.sort(ucodes)
[y] pandas/core/indexes/base.py:            taker = np.sort(taker)
[y] pandas/core/internals/managers.py:        indexer = np.sort(np.concatenate([b.mgr_locs.as_array for b in blocks]))
[n] pandas/core/reshape/reshape.py:            self.compressor = np.sort(np.unique(comp_index, return_index=True)[1])
[n] pandas/core/reshape/reshape.py:        level_codes = np.sort(level_codes)
[n] pandas/io/parsers/base_parser.py:            index_col.sort()
[n] pandas/io/stata.py:        self.value_labels.sort(key=lambda x: x[0])
pandas/tests/groupby/test_indexing.py:        levels.sort(key=lambda x: x[1])
pandas/tests/indexes/interval/test_interval_tree.py:        result = np.sort(indexer[1:3])
pandas/tests/indexes/interval/test_interval_tree.py:        result = np.sort(indexer[3:])
pandas/tests/indexes/interval/test_interval_tree.py:        result = np.sort(indexer)
pandas/tests/indexes/numeric/test_setops.py:        expected = Index(np.sort(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/numeric/test_setops.py:            np.sort(np.asarray(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/numeric/test_setops.py:        expected = Index(np.sort(np.intersect1d(index_large.values, other.values)))
pandas/tests/indexes/numeric/test_setops.py:            np.sort(np.asarray(np.intersect1d(index_large.values, other.values)))
pandas/tests/indexes/ranges/test_setops.py:        expected = Index(np.sort(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/ranges/test_setops.py:            np.sort(np.asarray(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/ranges/test_setops.py:        expected = Index(np.sort(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/ranges/test_setops.py:        expected = Index(np.sort(np.intersect1d(index.values, other.values)))
pandas/tests/indexes/test_any_index.py:        index.sort()
pandas/tests/indexes/test_common.py:    sorted_values = np.sort(not_na_vals)
pandas/tests/indexing/test_chaining_and_caching.py:    idxs.sort(axis=1)
pandas/tests/io/parser/dtypes/test_categorical.py:    data = np.sort([str(i) for i in range(524289)])
pandas/tests/io/parser/dtypes/test_categorical.py:        np.sort(actual.a.cat.categories), ordered=True
pandas/tests/libs/test_hashtable.py:        tm.assert_numpy_array_equal(np.sort(keys), expected)
pandas/tests/reshape/merge/test_merge.py:        var3 = np.sort(var3)
pandas/tests/scalar/test_nat.py:    missing.sort()
pandas/tests/scalar/test_nat.py:    overlap.sort()
pandas/tests/series/methods/test_astype.py:            tm.assert_almost_equal(np.sort(np.unique(a)), np.sort(np.unique(b)))
pandas/tests/series/methods/test_interpolate.py:        ser = Series(np.sort(np.random.uniform(size=100)))
pandas/tests/series/methods/test_interpolate.py:        s = Series(np.nan, index=np.sort(np.random.rand(30)))
pandas/tests/series/methods/test_sort_values.py:        tm.assert_numpy_array_equal(result[:-5].values, np.sort(vals[5:]))
pandas/tests/series/methods/test_sort_values.py:        tm.assert_numpy_array_equal(result[5:].values, np.sort(vals[5:]))
pandas/tests/series/methods/test_sort_values.py:        expected = np.sort(ts.dropna().values)[::-1]
pandas/tests/series/methods/test_sort_values.py:        expected = np.sort(ser.values)
pandas/tests/test_algos.py:        expected.sort()
pandas/tests/test_algos.py:        result.sort()
pandas/tests/window/test_rolling_quantile.py:    values = np.sort(a, axis=0)
[n] pandas/util/_decorators.py:        new_params.sort(key=lambda p: p.kind)
[n] pandas/_libs/algos.pyx:        sort_indexer = values.argsort(axis=0, kind=kind).astype(np.intp, copy=False)
[n] pandas/_libs/groupby.pyx:        obtained by `np.argsort(labels, kind="mergesort")`
[n] pandas/_libs/hashtable_func_helper.pxi.in:    arr = arr[np.asarray(labels)[arr].argsort()]
[y] pandas/_libs/index.pyx:        target_order = np.argsort(target).astype("int64")
[y] pandas/_libs/index.pyx:        return sorted_indexer[np.argsort(target_order)]
[n] pandas/_libs/intervaltree.pxi.in:            self._right_sorter = np.argsort(self.right)
[y] pandas/_libs/lib.pyx:        np.hstack([codes[starts[i]:starts[i+1]].argsort(kind='mergesort')
[y] pandas/_libs/lib.pyx:        out[l:r] = l + codes[l:r].argsort(kind="mergesort")
[n] pandas/_libs/tslibs/offsets.pyx:        index = np.argsort(start)
[y] pandas/core/algorithms.py:            sorter = values.argsort()
[y] pandas/core/algorithms.py:        order2 = sorter.argsort()
[y] pandas/core/algorithms.py:    str_argsort = np.argsort(values[str_pos])
[y] pandas/core/algorithms.py:    num_argsort = np.argsort(values[num_pos])
[y] pandas/core/arrays/arrow/array.py:            argsort = np.argsort(indices)
[n] pandas/core/arrays/categorical.py:        >>> pd.Categorical(['b', 'b', 'a', 'c']).argsort()
[n] pandas/core/arrays/categorical.py:        >>> cat.argsort()
[n] pandas/core/arrays/categorical.py:        >>> cat.argsort()
[n] pandas/core/arrays/categorical.py:        return super().argsort(ascending=ascending, kind=kind, **kwargs)
[n] pandas/core/arrays/categorical.py:        locs = locs.argsort()
[n] pandas/core/arrays/interval.py:        return super().argsort(
[n] pandas/core/arrays/interval.py:        indexer = obj.argsort()[0]
[n] pandas/core/arrays/interval.py:        indexer = obj.argsort()[-1]
[n] pandas/core/frame.py:        ...     key=lambda x: np.argsort(index_natsorted(df["time"]))
[n] pandas/core/generic.py:        >>> df.loc[(df.c - 43).abs().argsort()]
[n] pandas/core/generic.py:        ...     key=lambda x: np.argsort(index_natsorted(df["time"]))
[n] pandas/core/groupby/groupby.py:        result = result.take(np.argsort(sorted_index), axis=0)
[y] pandas/core/groupby/groupby.py:        sorted_labels = np.argsort(ids, kind="mergesort").astype(np.intp, copy=False)
[y] pandas/core/groupby/grouper.py:                    reverse_indexer = self._indexer.argsort()
[y] pandas/core/groupby/grouper.py:            indexer = self._indexer_deprecated = ax.array.argsort(
[n] pandas/core/indexes/base.py:            _as = idx.argsort(na_position=na_position)
[n] pandas/core/indexes/base.py:        >>> order = idx.argsort()
[n] pandas/core/indexes/base.py:        return self._data.argsort(*args, **kwargs)
[n] pandas/core/indexes/multi.py:                    indexer = lev.argsort()
[n] pandas/core/indexes/multi.py:            # lexsort is significantly faster than self._values.argsort()
[n] pandas/core/indexes/multi.py:        return self._values.argsort(*args, **kwargs)
[y] pandas/core/internals/managers.py:        argsort = np.argsort(new_mgr_locs)
[y] pandas/core/methods/selectn.py:        inds = ns[arr[ns].argsort(kind="mergesort")]
[n] pandas/core/missing.py:        indexer = np.argsort(indices[valid])
[n] pandas/core/series.py:        >>> s.argsort()
[n] pandas/core/series.py:            result[notmask] = np.argsort(values[notmask], kind=kind)
[n] pandas/core/series.py:            result = np.argsort(values, kind=kind)
[n] pandas/core/sorting.py:        return items.argsort(ascending=ascending)
[n] pandas/core/sorting.py:        return items.argsort(
[n] pandas/core/sorting.py:    indexer = non_nan_idx[non_nans.argsort(kind=kind)]
[y] pandas/core/sorting.py:    np.argsort(kind='mergesort') is O(count x log(count)) where count is the
[y] pandas/core/sorting.py:        sorter = group_index.argsort(kind="mergesort")
[n] pandas/core/sorting.py:    sorter = uniques.argsort()
[y] pandas/io/stata.py:            ii = np.argsort(off)
pandas/tests/arrays/categorical/test_sorting.py:            c.argsort(ascending=True), expected, check_dtype=False
pandas/tests/arrays/categorical/test_sorting.py:            c.argsort(ascending=False), expected, check_dtype=False
pandas/tests/arrays/categorical/test_sorting.py:        tm.assert_numpy_array_equal(np.argsort(c), expected, check_dtype=False)
pandas/tests/arrays/categorical/test_sorting.py:            np.argsort(c, kind="mergesort"), expected, check_dtype=False
pandas/tests/arrays/categorical/test_sorting.py:            np.argsort(c, axis=0)
pandas/tests/arrays/categorical/test_sorting.py:            np.argsort(c, order="C")
pandas/tests/arrays/numpy_/test_indexing.py:        result = arr.searchsorted([0, 3], sorter=np.argsort(arr))
pandas/tests/extension/base/methods.py:        result = pd.Series(data_for_sorting).argsort()
pandas/tests/extension/base/methods.py:        result = data_missing_for_sorting.argsort()
pandas/tests/extension/base/methods.py:        result = pd.Series(data_missing_for_sorting).argsort()
pandas/tests/frame/methods/test_sort_values.py:        indexer = frame["A"].argsort().values
pandas/tests/frame/methods/test_sort_values.py:        indexer = df["D"].argsort().values
pandas/tests/groupby/test_categorical.py:    idx = cats.codes.argsort()
pandas/tests/groupby/test_categorical.py:    idx = cats.codes.argsort()
pandas/tests/indexes/multi/test_sorting.py:    result = np.argsort(idx)
pandas/tests/indexes/multi/test_sorting.py:    expected = idx.argsort()
pandas/tests/indexes/multi/test_sorting.py:            np.argsort(idx, axis=1)
pandas/tests/indexes/multi/test_sorting.py:            np.argsort(idx, kind="mergesort")
pandas/tests/indexes/multi/test_sorting.py:            np.argsort(idx, order=("a", "b"))
pandas/tests/indexes/multi/test_sorting.py:    result = idx.argsort()
pandas/tests/indexes/multi/test_sorting.py:    expected = idx.values.argsort()
pandas/tests/indexes/numeric/test_join.py:        ind = res.argsort()
pandas/tests/indexes/numeric/test_join.py:        ind = res.argsort()
pandas/tests/indexes/ranges/test_join.py:        ind = res.argsort()
pandas/tests/indexes/test_base.py:            index.argsort()
pandas/tests/indexes/test_base.py:            np.argsort(index)
pandas/tests/indexes/test_datetimelike.py:        result = idx.argsort()
pandas/tests/indexes/test_datetimelike.py:        expected = idx._data.argsort()
pandas/tests/indexes/test_old_base.py:        result = index.argsort()
pandas/tests/indexes/test_old_base.py:        expected = np.array(index).argsort()
pandas/tests/indexes/test_old_base.py:        result = np.argsort(index)
pandas/tests/indexes/test_old_base.py:        expected = index.argsort()
pandas/tests/indexes/test_old_base.py:        result = np.argsort(index, kind="mergesort")
pandas/tests/indexes/test_old_base.py:        expected = index.argsort(kind="mergesort")
pandas/tests/indexes/test_old_base.py:                np.argsort(index, axis=1)
pandas/tests/indexes/test_old_base.py:                np.argsort(index, order=("a", "b"))
pandas/tests/indexing/multiindex/test_sorted.py:        result = index.argsort()
pandas/tests/libs/test_join.py:        exp_ls = left.argsort(kind="mergesort")
pandas/tests/libs/test_join.py:        exp_rs = right.argsort(kind="mergesort")
pandas/tests/libs/test_join.py:        exp_ls = left.argsort(kind="mergesort")
pandas/tests/libs/test_join.py:        exp_rs = right.argsort(kind="mergesort")
pandas/tests/libs/test_join.py:        exp_ls = left.argsort(kind="mergesort")
pandas/tests/libs/test_join.py:        exp_rs = right.argsort(kind="mergesort")
pandas/tests/series/methods/test_argsort.py:        argsorted = datetime_series.argsort()
pandas/tests/series/methods/test_argsort.py:        result = s.argsort()
pandas/tests/series/methods/test_argsort.py:        result = shifted.argsort()
pandas/tests/series/methods/test_argsort.py:        mindexer = s.argsort(kind="mergesort")
pandas/tests/series/methods/test_argsort.py:        qindexer = s.argsort()
pandas/tests/series/methods/test_argsort.py:        mexpected = np.argsort(s.values, kind="mergesort")
pandas/tests/series/methods/test_argsort.py:        qexpected = np.argsort(s.values, kind="quicksort")
pandas/tests/series/methods/test_argsort.py:        result = datetime_series.argsort()
pandas/tests/series/methods/test_searchsorted.py:        res = ser.searchsorted([0, 3], sorter=np.argsort(ser))
pandas/tests/test_algos.py:    expected = np.argsort(a, kind="mergesort")
pandas/tests/test_algos.py:    np.array([libalgos.Infinity()] * 32).argsort()
pandas/tests/test_algos.py:    np.array([libalgos.NegInfinity()] * 32).argsort()

Besides, I manually reverted the changes in #53548 and they (at least) passed on my local machine. Yet I cannot guarantee that I have made all necessary changes or that all the changes I have made are proper, so I would be glad if maintainers can help with the inspection.

Note 1 (in pandas/core/methods/selectn.py::SelectNSeries::compute): It seems that when n is less than the length in nlargest and nsmallest, pandas is already using a stable argsort but otherwise it calls DataFrame.sort_values without specifying kind="stable". In the current documentation, it says that nlargest(n) should be equivalent to sort_values(ascending=False).head(n) but this does not seem to be correct with numpy>=1.25 with AVX instructions. Alternatively it can be equivalent to sort_values(ascending=False, kind="stable").head(n) using kind="stable" internally. Should we make this change or did I miss anything?

Note 2 (in pandas/core/groupby/groupby.py::GroupBy::_value_counts): Here I specified kind="stable" in both sort_values and sort_index to obtain a stable result. The expected result in pandas/tests/groupby/test_value_counts.py::test_categorical_single_grouper_observed_false is will be changed consequently.

@Charlie-XIAO Charlie-XIAO changed the title Sort stable internal Make internal numpy sort and argsort use kind="stable" Jun 24, 2023
@Charlie-XIAO Charlie-XIAO changed the title Make internal numpy sort and argsort use kind="stable" CLN: Make internal numpy sort and argsort use kind="stable" Jun 24, 2023
@WillAyd
Copy link
Member

WillAyd commented Jun 25, 2023

Can you run the ASV benchmarks for groupby and algos to see if there are any regressions? I'm a little hesitant to blanket apply this without knowing moire about its impacts. Doubly so because the stable sort algorithm within NumPy can vary by dtype (?)

@Charlie-XIAO
Copy link
Contributor Author

Charlie-XIAO commented Jun 26, 2023

@WillAyd I've run the benchmarks for groupby but unfortunately got KeyError: 'q_25' when showing the result. This seems to be a known issue airspeed-velocity/asv#1028, and I need to take some time to figure out how to manually read data from the stored results.

@Charlie-XIAO
Copy link
Contributor Author

Due to the aforementioned error, I cannot use asv show [commit] to display results. The following are manually extracted from the results, but I failed to figure out how to compute the standard deviations so I only included the means. @WillAyd Please let me know if the results look strange which may indicate that I'm doing something wrong.

Benchmarking groupby:

Excluding nan and null

groupby.AggEngine.time_dataframe_cython
╒════════════╤════════╤════════╤════════╕
│ parallel   │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ True       │ 34.3ms │ 31.1ms │   0.91 │
├────────────┼────────┼────────┼────────┤
│ False      │ 30.2ms │ 29.7ms │   0.99 │
╘════════════╧════════╧════════╧════════╛

groupby.AggEngine.time_dataframe_numba
╒════════════╤═════════╤═════════╤════════╕
│ parallel   │ main    │ pr      │   frac │
╞════════════╪═════════╪═════════╪════════╡
│ True       │ 650.1ms │ 651.0ms │   1    │
├────────────┼─────────┼─────────┼────────┤
│ False      │ 296.2ms │ 291.8ms │   0.99 │
╘════════════╧═════════╧═════════╧════════╛

groupby.AggEngine.time_series_cython
╒════════════╤════════╤════════╤════════╕
│ parallel   │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ True       │ 30.4ms │ 28.3ms │   0.93 │
├────────────┼────────┼────────┼────────┤
│ False      │ 28.8ms │ 29.2ms │   1.02 │
╘════════════╧════════╧════════╧════════╛

groupby.AggEngine.time_series_numba
╒════════════╤═════════╤═════════╤════════╕
│ parallel   │ main    │ pr      │   frac │
╞════════════╪═════════╪═════════╪════════╡
│ True       │ 642.8ms │ 633.1ms │   0.98 │
├────────────┼─────────┼─────────┼────────┤
│ False      │ 300.5ms │ 287.3ms │   0.96 │
╘════════════╧═════════╧═════════╧════════╛

groupby.Apply.time_copy_function_multi_col
╒══════════╤═════════╤═════════╤════════╕
│   factor │ main    │ pr      │   frac │
╞══════════╪═════════╪═════════╪════════╡
│        4 │ 781.4ms │ 780.7ms │   1    │
├──────────┼─────────┼─────────┼────────┤
│        5 │ 47.6ms  │ 44.8ms  │   0.94 │
╘══════════╧═════════╧═════════╧════════╛

groupby.Apply.time_copy_overhead_single_col
╒══════════╤═════════╤═════════╤════════╕
│   factor │ main    │ pr      │   frac │
╞══════════╪═════════╪═════════╪════════╡
│        4 │ 174.1ms │ 171.7ms │   0.99 │
├──────────┼─────────┼─────────┼────────┤
│        5 │ 30.1ms  │ 26.8ms  │   0.89 │
╘══════════╧═════════╧═════════╧════════╛

groupby.Apply.time_scalar_function_multi_col
╒══════════╤════════╤════════╤════════╕
│   factor │ main   │ pr     │   frac │
╞══════════╪════════╪════════╪════════╡
│        4 │ 86.9ms │ 86.4ms │   0.99 │
├──────────┼────────┼────────┼────────┤
│        5 │ 14.2ms │ 13.8ms │   0.97 │
╘══════════╧════════╧════════╧════════╛

groupby.Apply.time_scalar_function_single_col
╒══════════╤════════╤════════╤════════╕
│   factor │ main   │ pr     │   frac │
╞══════════╪════════╪════════╪════════╡
│        4 │ 32.1ms │ 31.3ms │   0.97 │
├──────────┼────────┼────────┼────────┤
│        5 │ 7.1ms  │ 7.2ms  │   1.02 │
╘══════════╧════════╧════════╧════════╛

groupby.ApplyDictReturn.time_groupby_apply_dict_return
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 22.1ms │ 21.6ms │   0.98 │
╘════════╧════════╧════════╛

groupby.ApplyNonUniqueUnsortedIndex.time_groupby_apply_non_unique_unsorted_index
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 9.4ms  │ 9.5ms │   1.01 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_extra_cat_nosort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 4.5ms  │ 4.5ms │      1 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_extra_cat_sort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.6ms  │ 0.6ms │   0.98 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_nosort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 4.5ms  │ 4.6ms │   1.02 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_ordered_nosort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 4.6ms  │ 4.7ms │   1.03 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_ordered_sort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.6ms  │ 0.6ms │   1.02 │
╘════════╧═══════╧════════╛

groupby.Categories.time_groupby_sort
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.6ms  │ 0.6ms │   0.97 │
╘════════╧═══════╧════════╛

groupby.Cumulative.time_frame_transform
╒═══════════╤══════════╤═════════════╤════════╤════════╤════════╕
│ dtype     │ method   │ with_nans   │ main   │ pr     │   frac │
╞═══════════╪══════════╪═════════════╪════════╪════════╪════════╡
│ 'float64' │ 'cummin' │ True        │ 17.4ms │ 18.3ms │   1.05 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'float64' │ 'cummin' │ False       │ 19.3ms │ 18.7ms │   0.97 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'float64' │ 'cummax' │ True        │ 17.9ms │ 18.9ms │   1.06 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'float64' │ 'cummax' │ False       │ 20.0ms │ 19.4ms │   0.97 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'float64' │ 'cumsum' │ True        │ 18.8ms │ 18.7ms │   1    │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'float64' │ 'cumsum' │ False       │ 19.6ms │ 19.6ms │   1    │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'int64'   │ 'cummin' │ False       │ 18.4ms │ 18.1ms │   0.98 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'int64'   │ 'cummax' │ False       │ 19.0ms │ 17.5ms │   0.92 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'int64'   │ 'cumsum' │ False       │ 17.7ms │ 18.1ms │   1.02 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cummin' │ True        │ 22.1ms │ 22.1ms │   1    │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cummin' │ False       │ 22.8ms │ 23.4ms │   1.03 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cummax' │ True        │ 22.6ms │ 24.9ms │   1.1  │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cummax' │ False       │ 23.3ms │ 21.6ms │   0.93 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cumsum' │ True        │ 23.5ms │ 23.8ms │   1.01 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Float64' │ 'cumsum' │ False       │ 25.0ms │ 25.3ms │   1.01 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cummin' │ True        │ 20.9ms │ 20.6ms │   0.99 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cummin' │ False       │ 20.9ms │ 21.3ms │   1.02 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cummax' │ True        │ 20.6ms │ 22.3ms │   1.08 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cummax' │ False       │ 20.1ms │ 19.9ms │   0.99 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cumsum' │ True        │ 23.6ms │ 23.8ms │   1.01 │
├───────────┼──────────┼─────────────┼────────┼────────┼────────┤
│ 'Int64'   │ 'cumsum' │ False       │ 22.0ms │ 22.3ms │   1.01 │
╘═══════════╧══════════╧═════════════╧════════╧════════╧════════╛

groupby.DateAttributes.time_len_groupby_object
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 49.9ms │ 46.4ms │   0.93 │
╘════════╧════════╧════════╛

groupby.Datelike.time_sum
╒═════════════════╤════════╤═══════╤════════╕
│ grouper         │ main   │ pr    │   frac │
╞═════════════════╪════════╪═══════╪════════╡
│ 'period_range'  │ 0.9ms  │ 0.8ms │   0.87 │
├─────────────────┼────────┼───────┼────────┤
│ 'date_range'    │ 0.4ms  │ 0.4ms │   1.05 │
├─────────────────┼────────┼───────┼────────┤
│ 'date_range_tz' │ 0.4ms  │ 0.4ms │   1    │
╘═════════════════╧════════╧═══════╧════════╛

groupby.FillNA.time_df_bfill
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.9ms  │ 1.0ms │   1.08 │
╘════════╧═══════╧════════╛

groupby.FillNA.time_df_ffill
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.8ms  │ 0.9ms │   1.01 │
╘════════╧═══════╧════════╛

groupby.FillNA.time_srs_bfill
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.9ms  │ 0.9ms │   0.94 │
╘════════╧═══════╧════════╛

groupby.FillNA.time_srs_ffill
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.9ms  │ 0.8ms │   0.97 │
╘════════╧═══════╧════════╛

groupby.Float32.time_sum
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 7.9ms  │ 9.0ms │   1.14 │
╘════════╧═══════╧════════╛

groupby.GroupByCythonAgg.time_frame_agg
╒═══════════╤══════════╤═════════╤═════════╤════════╕
│ dtype     │ method   │ main    │ pr      │   frac │
╞═══════════╪══════════╪═════════╪═════════╪════════╡
│ 'float64' │ 'sum'    │ 39.0ms  │ 39.3ms  │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'prod'   │ 32.2ms  │ 32.6ms  │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'mean'   │ 41.9ms  │ 43.8ms  │   1.05 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'median' │ 243.3ms │ 242.7ms │   1    │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'var'    │ 53.2ms  │ 54.8ms  │   1.03 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'first'  │ 29.1ms  │ 29.2ms  │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'last'   │ 28.3ms  │ 29.6ms  │   1.05 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'any'    │ 55.3ms  │ 55.3ms  │   1    │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'all'    │ 48.1ms  │ 49.1ms  │   1.02 │
╘═══════════╧══════════╧═════════╧═════════╧════════╛

groupby.GroupByCythonAggEaDtypes.time_frame_agg
╒═══════════╤══════════╤═════════╤═════════╤════════╕
│ dtype     │ method   │ main    │ pr      │   frac │
╞═══════════╪══════════╪═════════╪═════════╪════════╡
│ 'Float64' │ 'sum'    │ 64.6ms  │ 65.3ms  │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'prod'   │ 54.5ms  │ 53.0ms  │   0.97 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'min'    │ 58.2ms  │ 59.1ms  │   1.02 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'max'    │ 56.9ms  │ 57.9ms  │   1.02 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'mean'   │ 58.8ms  │ 60.4ms  │   1.03 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'median' │ 247.7ms │ 255.9ms │   1.03 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'var'    │ 79.3ms  │ 79.8ms  │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'first'  │ 51.0ms  │ 53.0ms  │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'last'   │ 55.1ms  │ 54.4ms  │   0.99 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'any'    │ 71.1ms  │ 69.8ms  │   0.98 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Float64' │ 'all'    │ 58.2ms  │ 58.3ms  │   1    │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'sum'    │ 58.6ms  │ 60.6ms  │   1.03 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'prod'   │ 50.0ms  │ 52.3ms  │   1.05 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'min'    │ 53.6ms  │ 52.8ms  │   0.99 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'max'    │ 51.5ms  │ 51.2ms  │   0.99 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'mean'   │ 78.0ms  │ 81.0ms  │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'median' │ 272.0ms │ 273.5ms │   1.01 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'var'    │ 100.2ms │ 99.7ms  │   0.99 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'first'  │ 52.7ms  │ 55.0ms  │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'last'   │ 59.5ms  │ 66.0ms  │   1.11 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'any'    │ 65.1ms  │ 66.6ms  │   1.02 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int64'   │ 'all'    │ 50.9ms  │ 52.9ms  │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'sum'    │ 95.5ms  │ 99.2ms  │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'prod'   │ 87.1ms  │ 92.6ms  │   1.06 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'min'    │ 55.3ms  │ 55.5ms  │   1    │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'max'    │ 54.9ms  │ 56.1ms  │   1.02 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'mean'   │ 93.5ms  │ 92.9ms  │   0.99 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'median' │ 289.3ms │ 283.8ms │   0.98 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'var'    │ 114.5ms │ 120.4ms │   1.05 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'first'  │ 60.9ms  │ 65.6ms  │   1.08 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'last'   │ 55.0ms  │ 56.1ms  │   1.02 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'any'    │ 73.0ms  │ 79.2ms  │   1.08 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'Int32'   │ 'all'    │ 63.8ms  │ 69.1ms  │   1.08 │
╘═══════════╧══════════╧═════════╧═════════╧════════╛

groupby.GroupByMethods.time_dtype_as_field
╒══════════╤════════════════╤═══════════════╤═════════╤══════════╤════════╤════════╤════════╕
│ dtype    │ method         │ application   │   ncols │ param5   │ main   │ pr     │   frac │
╞══════════╪════════════════╪═══════════════╪═════════╪══════════╪════════╪════════╪════════╡
│ 'int'    │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 17.3ms │ 17.5ms │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.8ms  │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.93 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.9ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 55.0ms │ 58.2ms │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.92 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.3ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.3ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.18 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 43.8ms │ 44.4ms │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.7ms  │ 1.7ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 17.1ms │ 18.1ms │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.3ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.93 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.8ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 1.0ms  │ 0.8ms  │   0.83 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   0.95 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 57.9ms │ 58.3ms │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.94 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.3ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.2ms  │   1.69 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.23 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 44.8ms │ 45.2ms │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.7ms  │ 1.5ms  │   0.91 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 17.7ms │ 17.0ms │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.8ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.8ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.4ms  │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 56.3ms │ 58.0ms │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.4ms  │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.95 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.7ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   0.94 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 44.6ms │ 44.4ms │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.8ms  │ 1.7ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.17 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.2ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.3ms  │   0.95 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 1.6ms  │ 1.5ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 39.5ms │ 38.6ms │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.4ms  │ 1.5ms  │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.89 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.94 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 17.1ms │ 18.7ms │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.95 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 1.0ms  │ 0.9ms  │   0.86 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.9ms  │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 55.4ms │ 65.2ms │   1.18 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.3ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.7ms  │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.9ms  │   1.47 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   0.94 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 42.4ms │ 43.4ms │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.8ms  │ 1.6ms  │   0.9  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.02 │
╘══════════╧════════════════╧═══════════════╧═════════╧══════════╧════════╧════════╧════════╛

groupby.GroupByMethods.time_dtype_as_group
╒══════════╤════════════════╤═══════════════╤═════════╤══════════╤═════════╤═════════╤════════╕
│ dtype    │ method         │ application   │   ncols │ param5   │ main    │ pr      │   frac │
╞══════════╪════════════════╪═══════════════╪═════════╪══════════╪═════════╪═════════╪════════╡
│ 'int'    │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.95 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.81 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 29.3ms  │ 30.5ms  │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 0.9ms   │ 1.0ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.9ms   │ 1.1ms   │   1.15 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.7ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 84.6ms  │ 83.1ms  │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.3ms   │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.8ms   │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.7ms   │   1.2  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 65.2ms  │ 66.1ms  │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.6ms   │ 1.7ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int'    │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.8ms   │   1.28 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.2  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 27.4ms  │ 25.5ms  │   0.93 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.17 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 0.9ms   │ 0.9ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.9ms   │ 1.2ms   │   1.33 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.6ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 80.8ms  │ 85.2ms  │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.17 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.7ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.6ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 61.1ms  │ 69.1ms  │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.6ms   │ 1.7ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'int16'  │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.8ms   │   1.23 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.18 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 39.9ms  │ 36.6ms  │   0.92 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.93 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 1.3ms   │ 1.4ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 1.2ms   │ 1.5ms   │   1.21 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.8ms   │ 0.8ms   │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 126.5ms │ 138.9ms │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.15 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.15 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.8ms   │ 0.8ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.8ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.92 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 98.3ms  │ 105.2ms │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.7ms   │ 1.5ms   │   0.91 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'float'  │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.8ms   │   1.21 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.2  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.99 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   0.97 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.4ms   │   1.06 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'object' │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.4ms   │ 1.5ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'all'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'any'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'bfill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'count'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'cumcount'     │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'cummax'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'cummin'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'cumprod'      │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.14 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'cumsum'       │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.12 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'describe'     │ 'direct'      │       1 │ 'cython' │ 29.0ms  │ 31.6ms  │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'diff'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'ffill'        │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'first'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.98 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'head'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'last'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'max'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'max'          │ 'direct'      │       1 │ 'numba'  │ 1.0ms   │ 1.0ms   │   1    │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'min'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'min'          │ 'direct'      │       1 │ 'numba'  │ 0.9ms   │ 1.0ms   │   1.01 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'median'       │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'mean'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.05 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'mean'         │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.7ms   │   1.16 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'nunique'      │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'pct_change'   │ 'direct'      │       1 │ 'cython' │ 85.6ms  │ 88.6ms  │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'prod'         │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'quantile'     │ 'direct'      │       1 │ 'cython' │ 0.3ms   │ 0.3ms   │   1.04 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'rank'         │ 'direct'      │       1 │ 'cython' │ 0.4ms   │ 0.4ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'sem'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'shift'        │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   0.96 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'size'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.13 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'skew'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.1  │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'std'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.07 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'std'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.8ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'sum'          │ 'direct'      │       1 │ 'cython' │ 0.2ms   │ 0.2ms   │   1.09 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'sum'          │ 'direct'      │       1 │ 'numba'  │ 0.7ms   │ 0.7ms   │   1.02 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'tail'         │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'unique'       │ 'direct'      │       1 │ 'cython' │ 61.4ms  │ 66.6ms  │   1.08 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'value_counts' │ 'direct'      │       1 │ 'cython' │ 1.6ms   │ 1.7ms   │   1.03 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'var'          │ 'direct'      │       1 │ 'cython' │ 0.1ms   │ 0.1ms   │   1.11 │
├──────────┼────────────────┼───────────────┼─────────┼──────────┼─────────┼─────────┼────────┤
│ 'uint'   │ 'var'          │ 'direct'      │       1 │ 'numba'  │ 0.6ms   │ 0.7ms   │   1.16 │
╘══════════╧════════════════╧═══════════════╧═════════╧══════════╧═════════╧═════════╧════════╛

groupby.GroupByNumbaAgg.time_frame_agg
╒═══════════╤══════════╤═════════╤═════════╤════════╕
│ dtype     │ method   │ main    │ pr      │   frac │
╞═══════════╪══════════╪═════════╪═════════╪════════╡
│ 'float64' │ 'sum'    │ 167.0ms │ 173.9ms │   1.04 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'mean'   │ 193.7ms │ 219.9ms │   1.13 │
├───────────┼──────────┼─────────┼─────────┼────────┤
│ 'float64' │ 'var'    │ 206.0ms │ 211.5ms │   1.03 │
╘═══════════╧══════════╧═════════╧═════════╧════════╛

groupby.GroupManyLabels.time_sum
╒═════════╤════════╤═══════╤════════╕
│   ncols │ main   │ pr    │   frac │
╞═════════╪════════╪═══════╪════════╡
│       1 │ 0.3ms  │ 0.3ms │   1.05 │
├─────────┼────────┼───────┼────────┤
│    1000 │ 4.2ms  │ 4.5ms │   1.07 │
╘═════════╧════════╧═══════╧════════╛

groupby.GroupStrings.time_multi_columns
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 327.3ms │ 351.1ms │   1.07 │
╘═════════╧═════════╧════════╛

groupby.Int64.time_overflow
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 210.7ms │ 219.4ms │   1.04 │
╘═════════╧═════════╧════════╛

groupby.Nth.time_frame_nth
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 10.8ms │ 10.1ms │   0.93 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 10.8ms │ 10.0ms │   0.93 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 11.5ms │ 10.0ms │   0.87 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 11.2ms │ 10.1ms │   0.91 │
╘════════════╧════════╧════════╧════════╛

groupby.Nth.time_frame_nth_any
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 22.2ms │ 20.4ms │   0.92 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 21.9ms │ 20.2ms │   0.92 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 24.6ms │ 21.1ms │   0.86 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 26.1ms │ 24.2ms │   0.93 │
╘════════════╧════════╧════════╧════════╛

groupby.Nth.time_groupby_nth_all
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 11.5ms │ 10.9ms │   0.95 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 11.9ms │ 11.2ms │   0.94 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 12.7ms │ 12.0ms │   0.94 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 15.9ms │ 14.4ms │   0.91 │
╘════════════╧════════╧════════╧════════╛

groupby.Nth.time_series_nth
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 11.1ms │ 10.2ms │   0.91 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 11.4ms │ 10.6ms │   0.93 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 12.8ms │ 10.7ms │   0.83 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 12.1ms │ 10.4ms │   0.86 │
╘════════════╧════════╧════════╧════════╛

groupby.Nth.time_series_nth_all
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 21.0ms │ 18.2ms │   0.87 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 21.2ms │ 19.3ms │   0.91 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 21.4ms │ 19.6ms │   0.92 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 24.8ms │ 22.3ms │   0.9  │
╘════════════╧════════╧════════╧════════╛

groupby.Nth.time_series_nth_any
╒════════════╤════════╤════════╤════════╕
│ dtype      │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ 'float32'  │ 21.3ms │ 19.3ms │   0.91 │
├────────────┼────────┼────────┼────────┤
│ 'float64'  │ 20.6ms │ 19.2ms │   0.93 │
├────────────┼────────┼────────┼────────┤
│ 'datetime' │ 22.1ms │ 18.2ms │   0.83 │
├────────────┼────────┼────────┼────────┤
│ 'object'   │ 24.5ms │ 22.7ms │   0.93 │
╘════════════╧════════╧════════╧════════╛

groupby.RankWithTies.time_rank_ties
╒══════════════╤══════════════╤════════╤═══════╤════════╕
│ dtype        │ tie_method   │ main   │ pr    │   frac │
╞══════════════╪══════════════╪════════╪═══════╪════════╡
│ 'float64'    │ 'first'      │ 0.9ms  │ 1.0ms │   1.14 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float64'    │ 'average'    │ 1.0ms  │ 1.0ms │   1    │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float64'    │ 'dense'      │ 0.9ms  │ 1.0ms │   1.08 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float64'    │ 'min'        │ 0.9ms  │ 1.0ms │   1.07 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float64'    │ 'max'        │ 1.0ms  │ 1.1ms │   1.1  │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float32'    │ 'first'      │ 1.0ms  │ 1.1ms │   1.06 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float32'    │ 'average'    │ 1.0ms  │ 1.0ms │   1.02 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float32'    │ 'dense'      │ 1.0ms  │ 0.9ms │   0.92 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float32'    │ 'min'        │ 1.0ms  │ 1.0ms │   1.04 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'float32'    │ 'max'        │ 1.0ms  │ 1.0ms │   1.05 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'int64'      │ 'first'      │ 1.0ms  │ 1.0ms │   1.03 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'int64'      │ 'average'    │ 1.0ms  │ 1.0ms │   1.03 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'int64'      │ 'dense'      │ 1.0ms  │ 1.0ms │   1.05 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'int64'      │ 'min'        │ 0.9ms  │ 0.9ms │   1.02 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'int64'      │ 'max'        │ 1.0ms  │ 1.0ms │   0.98 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'datetime64' │ 'first'      │ 1.0ms  │ 1.0ms │   0.98 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'datetime64' │ 'average'    │ 1.0ms  │ 1.1ms │   1.06 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'datetime64' │ 'dense'      │ 1.0ms  │ 1.0ms │   0.98 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'datetime64' │ 'min'        │ 1.0ms  │ 1.0ms │   1.02 │
├──────────────┼──────────────┼────────┼───────┼────────┤
│ 'datetime64' │ 'max'        │ 1.0ms  │ 1.0ms │   0.96 │
╘══════════════╧══════════════╧════════╧═══════╧════════╛

groupby.Resample.time_resample
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 18.1ms │ 17.4ms │   0.96 │
╘════════╧════════╧════════╛

groupby.Resample.time_resample_multiindex
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 16.2ms │ 17.5ms │   1.08 │
╘════════╧════════╧════════╛

groupby.Sample.time_sample
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 41.9ms │ 44.2ms │   1.06 │
╘════════╧════════╧════════╛

groupby.Sample.time_sample_weights
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 92.6ms │ 98.2ms │   1.06 │
╘════════╧════════╧════════╛

groupby.Shift.time_defaults
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.5ms  │ 0.5ms │   1.01 │
╘════════╧═══════╧════════╛

groupby.Shift.time_fill_value
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.5ms  │ 0.5ms │      1 │
╘════════╧═══════╧════════╛

groupby.Size.time_category_size
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 1.4ms  │ 1.5ms │   1.08 │
╘════════╧═══════╧════════╛

groupby.Size.time_multi_size
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 13.3ms │ 13.9ms │   1.04 │
╘════════╧════════╧════════╛

groupby.String.time_str_func
╒══════════════════╤══════════╤═════════╤═════════╤════════╕
│ dtype            │ method   │ main    │ pr      │   frac │
╞══════════════════╪══════════╪═════════╪═════════╪════════╡
│ 'str'            │ 'sum'    │ 12.3ms  │ 13.3ms  │   1.08 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'min'    │ 71.7ms  │ 76.0ms  │   1.06 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'max'    │ 69.2ms  │ 75.2ms  │   1.09 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'first'  │ 5.1ms   │ 4.9ms   │   0.97 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'last'   │ 4.9ms   │ 5.8ms   │   1.17 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'any'    │ 7.5ms   │ 8.6ms   │   1.14 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'str'            │ 'all'    │ 7.8ms   │ 9.9ms   │   1.28 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'sum'    │ 14.0ms  │ 15.8ms  │   1.13 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'min'    │ 99.0ms  │ 109.2ms │   1.1  │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'max'    │ 103.5ms │ 103.5ms │   1    │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'first'  │ 7.4ms   │ 7.5ms   │   1.02 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'last'   │ 7.4ms   │ 7.6ms   │   1.04 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'any'    │ 10.1ms  │ 9.7ms   │   0.96 │
├──────────────────┼──────────┼─────────┼─────────┼────────┤
│ 'string[python]' │ 'all'    │ 9.4ms   │ 10.4ms  │   1.1  │
╘══════════════════╧══════════╧═════════╧═════════╧════════╛

groupby.SumBools.time_groupby_sum_booleans
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.7ms  │ 0.7ms │   0.99 │
╘════════╧═══════╧════════╛

groupby.SumMultiLevel.time_groupby_sum_multiindex
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.6ms  │ 0.7ms │   1.12 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_lambda_max
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 204.3ms │ 212.7ms │   1.04 │
╘═════════╧═════════╧════════╛

groupby.Transform.time_transform_lambda_max_tall
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 183.1ms │ 185.0ms │   1.01 │
╘═════════╧═════════╧════════╛

groupby.Transform.time_transform_lambda_max_wide
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 73.6ms │ 76.4ms │   1.04 │
╘════════╧════════╧════════╛

groupby.Transform.time_transform_multi_key1
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 7.7ms  │ 7.7ms │      1 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_multi_key2
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 6.6ms  │ 7.3ms │    1.1 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_multi_key3
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 4.9ms  │ 5.4ms │   1.09 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_multi_key4
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 2.6ms  │ 2.8ms │    1.1 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_ufunc_max
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 5.6ms  │ 6.1ms │   1.09 │
╘════════╧═══════╧════════╛

groupby.TransformBools.time_transform_mean
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 3.0ms  │ 3.2ms │   1.07 │
╘════════╧═══════╧════════╛

groupby.TransformEngine.time_dataframe_cython
╒════════════╤════════╤════════╤════════╕
│ parallel   │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ True       │ 31.5ms │ 32.0ms │   1.02 │
├────────────┼────────┼────────┼────────┤
│ False      │ 32.0ms │ 33.4ms │   1.04 │
╘════════════╧════════╧════════╧════════╛

groupby.TransformEngine.time_dataframe_numba
╒════════════╤═════════╤═════════╤════════╕
│ parallel   │ main    │ pr      │   frac │
╞════════════╪═════════╪═════════╪════════╡
│ True       │ 815.4ms │ 852.0ms │   1.04 │
├────────────┼─────────┼─────────┼────────┤
│ False      │ 358.5ms │ 380.3ms │   1.06 │
╘════════════╧═════════╧═════════╧════════╛

groupby.TransformEngine.time_series_cython
╒════════════╤════════╤════════╤════════╕
│ parallel   │ main   │ pr     │   frac │
╞════════════╪════════╪════════╪════════╡
│ True       │ 33.2ms │ 34.7ms │   1.05 │
├────────────┼────────┼────────┼────────┤
│ False      │ 34.5ms │ 34.8ms │   1.01 │
╘════════════╧════════╧════════╧════════╛

groupby.TransformEngine.time_series_numba
╒════════════╤═════════╤═════════╤════════╕
│ parallel   │ main    │ pr      │   frac │
╞════════════╪═════════╪═════════╪════════╡
│ True       │ 811.4ms │ 855.6ms │   1.05 │
├────────────┼─────────┼─────────┼────────┤
│ False      │ 361.4ms │ 378.5ms │   1.05 │
╘════════════╧═════════╧═════════╧════════╛

groupby.TransformNaN.time_first
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.9ms  │ 0.9ms │   0.97 │
╘════════╧═══════╧════════╛

hash_functions.Float64GroupIndex.time_groupby
None
rolling.GroupbyEWM.time_groupby_method
╒══════════╤════════╤═══════╤════════╕
│ method   │ main   │ pr    │   frac │
╞══════════╪════════╪═══════╪════════╡
│ 'var'    │ 1.3ms  │ 1.4ms │   1.1  │
├──────────┼────────┼───────┼────────┤
│ 'std'    │ 1.5ms  │ 1.5ms │   1.03 │
├──────────┼────────┼───────┼────────┤
│ 'cov'    │ 3.7ms  │ 3.9ms │   1.06 │
├──────────┼────────┼───────┼────────┤
│ 'corr'   │ 4.1ms  │ 4.3ms │   1.03 │
╘══════════╧════════╧═══════╧════════╛

rolling.GroupbyEWMEngine.time_groupby_mean
╒══════════╤════════╤═══════╤════════╕
│ engine   │ main   │ pr    │   frac │
╞══════════╪════════╪═══════╪════════╡
│ 'cython' │ 1.3ms  │ 1.5ms │   1.15 │
├──────────┼────────┼───────┼────────┤
│ 'numba'  │ 1.5ms  │ 1.4ms │   0.91 │
╘══════════╧════════╧═══════╧════════╛

rolling.Pairwise.time_groupby
╒═══════════════════════════════╤══════════╤════════════╤════════╤════════╤════════╕
│ window_kwargs                 │ method   │ pairwise   │ main   │ pr     │   frac │
╞═══════════════════════════════╪══════════╪════════════╪════════╪════════╪════════╡
│ ({'window': 10}, 'rolling')   │ 'corr'   │ True       │ 36.7ms │ 37.5ms │   1.02 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 10}, 'rolling')   │ 'corr'   │ False      │ 27.5ms │ 28.6ms │   1.04 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 10}, 'rolling')   │ 'cov'    │ True       │ 38.4ms │ 38.0ms │   0.99 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 10}, 'rolling')   │ 'cov'    │ False      │ 27.2ms │ 26.0ms │   0.96 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 1000}, 'rolling') │ 'corr'   │ True       │ 38.2ms │ 37.5ms │   0.98 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 1000}, 'rolling') │ 'corr'   │ False      │ 25.9ms │ 28.7ms │   1.11 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 1000}, 'rolling') │ 'cov'    │ True       │ 37.7ms │ 39.2ms │   1.04 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 1000}, 'rolling') │ 'cov'    │ False      │ 26.5ms │ 27.5ms │   1.04 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({}, 'expanding')             │ 'corr'   │ True       │ 36.3ms │ 38.9ms │   1.07 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({}, 'expanding')             │ 'corr'   │ False      │ 25.3ms │ 30.2ms │   1.19 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({}, 'expanding')             │ 'cov'    │ True       │ 35.8ms │ 36.4ms │   1.02 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({}, 'expanding')             │ 'cov'    │ False      │ 23.9ms │ 27.1ms │   1.13 │
╘═══════════════════════════════╧══════════╧════════════╧════════╧════════╧════════╛

groupby.AggFunctions.time_different_numpy_functions
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 12.6ms │ 14.1ms │   1.12 │
╘════════╧════════╧════════╛

groupby.AggFunctions.time_different_python_functions_multicol
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 17.1ms │ 17.8ms │   1.04 │
╘════════╧════════╧════════╛

groupby.AggFunctions.time_different_python_functions_singlecol
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 11.6ms │ 11.9ms │   1.03 │
╘════════╧════════╧════════╛

groupby.AggFunctions.time_different_str_functions
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 12.6ms │ 13.0ms │   1.03 │
╘════════╧════════╧════════╛

groupby.CountMultiDtype.time_multi_count
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 2.7ms  │ 2.9ms │   1.07 │
╘════════╧═══════╧════════╛

groupby.CountMultiInt.time_multi_int_count
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 2.0ms  │ 2.3ms │   1.12 │
╘════════╧═══════╧════════╛

groupby.CountMultiInt.time_multi_int_nunique
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 5.8ms  │ 5.5ms │   0.94 │
╘════════╧═══════╧════════╛

groupby.Groups.time_series_groups
╒════════════════╤═════════╤═════════╤════════╕
│ key            │ main    │ pr      │   frac │
╞════════════════╪═════════╪═════════╪════════╡
│ 'int64_small'  │ 31.3ms  │ 35.7ms  │   1.14 │
├────────────────┼─────────┼─────────┼────────┤
│ 'int64_large'  │ 93.8ms  │ 105.6ms │   1.13 │
├────────────────┼─────────┼─────────┼────────┤
│ 'object_small' │ 61.6ms  │ 70.7ms  │   1.15 │
├────────────────┼─────────┼─────────┼────────┤
│ 'object_large' │ 163.0ms │ 180.3ms │   1.11 │
╘════════════════╧═════════╧═════════╧════════╛

groupby.Groups.time_series_indices
╒════════════════╤═════════╤═════════╤════════╕
│ key            │ main    │ pr      │   frac │
╞════════════════╪═════════╪═════════╪════════╡
│ 'int64_small'  │ 36.6ms  │ 39.2ms  │   1.07 │
├────────────────┼─────────┼─────────┼────────┤
│ 'int64_large'  │ 57.5ms  │ 61.7ms  │   1.07 │
├────────────────┼─────────┼─────────┼────────┤
│ 'object_small' │ 75.0ms  │ 74.8ms  │   1    │
├────────────────┼─────────┼─────────┼────────┤
│ 'object_large' │ 123.2ms │ 139.4ms │   1.13 │
╘════════════════╧═════════╧═════════╧════════╛

groupby.MultiColumn.time_col_select_lambda_sum
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 225.7ms │ 233.0ms │   1.03 │
╘═════════╧═════════╧════════╛

groupby.MultiColumn.time_col_select_numpy_sum
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 15.1ms │ 15.3ms │   1.01 │
╘════════╧════════╧════════╛

groupby.MultiColumn.time_cython_sum
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 15.2ms │ 14.7ms │   0.96 │
╘════════╧════════╧════════╛

groupby.MultiColumn.time_lambda_sum
╒═════════╤═════════╤════════╕
│ main    │ pr      │   frac │
╞═════════╪═════════╪════════╡
│ 440.1ms │ 461.8ms │   1.05 │
╘═════════╧═════════╧════════╛
Only those with >= 10% regression

groupby.Cumulative.time_frame_transform
╒═══════════╤══════════╤═════════════╤════════╤════════╤════════╕
│ dtype     │ method   │ with_nans   │ main   │ pr     │   frac │
╞═══════════╪══════════╪═════════════╪════════╪════════╪════════╡
│ 'Float64' │ 'cummax' │ True        │ 22.6ms │ 24.9ms │    1.1 │
╘═══════════╧══════════╧═════════════╧════════╧════════╧════════╛

groupby.Float32.time_sum
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 7.9ms  │ 9.0ms │   1.14 │
╘════════╧═══════╧════════╛

groupby.GroupByCythonAggEaDtypes.time_frame_agg
╒═════════╤══════════╤════════╤════════╤════════╕
│ dtype   │ method   │ main   │ pr     │   frac │
╞═════════╪══════════╪════════╪════════╪════════╡
│ 'Int64' │ 'last'   │ 59.5ms │ 66.0ms │   1.11 │
╘═════════╧══════════╧════════╧════════╧════════╛

groupby.GroupByMethods.time_dtype_as_field
╒══════════╤══════════════╤═══════════════╤═════════╤══════════╤════════╤════════╤════════╕
│ dtype    │ method       │ application   │   ncols │ param5   │ main   │ pr     │   frac │
╞══════════╪══════════════╪═══════════════╪═════════╪══════════╪════════╪════════╪════════╡
│ 'int16'  │ 'size'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.2ms  │   1.69 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'sum'        │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.9ms  │   1.47 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'std'        │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.23 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'sum'        │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.18 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'pct_change' │ 'direct'      │       1 │ 'cython' │ 55.4ms │ 65.2ms │   1.18 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'var'        │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.17 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'count'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'prod'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'any'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'std'        │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.16 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'head'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cumprod'    │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'bfill'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.14 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'mean'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'size'       │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'min'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'min'        │ 'direct'      │       1 │ 'numba'  │ 0.8ms  │ 0.9ms  │   1.13 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'std'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.12 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'bfill'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.12 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'quantile'   │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.4ms  │   1.12 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'        │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.12 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'nunique'    │ 'direct'      │       1 │ 'cython' │ 0.3ms  │ 0.4ms  │   1.12 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'std'        │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.7ms  │   1.11 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'all'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'cumcount'   │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.11 │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'var'        │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.1  │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'min'        │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼──────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'mean'       │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.6ms  │   1.1  │
╘══════════╧══════════════╧═══════════════╧═════════╧══════════╧════════╧════════╧════════╛

groupby.GroupByMethods.time_dtype_as_group
╒══════════╤════════════╤═══════════════╤═════════╤══════════╤════════╤════════╤════════╕
│ dtype    │ method     │ application   │   ncols │ param5   │ main   │ pr     │   frac │
╞══════════╪════════════╪═══════════════╪═════════╪══════════╪════════╪════════╪════════╡
│ 'int16'  │ 'min'      │ 'direct'      │       1 │ 'numba'  │ 0.9ms  │ 1.2ms  │   1.33 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'var'      │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.8ms  │   1.28 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'      │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.8ms  │   1.23 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'var'      │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.21 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'min'      │ 'direct'      │       1 │ 'numba'  │ 1.2ms  │ 1.5ms  │   1.21 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'count'    │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.2  │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'any'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.2  │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'sum'      │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.2  │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'cumcount' │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.18 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'first'    │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.17 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'size'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.17 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'mean'     │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.16 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'last'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'any'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.16 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'var'      │ 'direct'      │       1 │ 'numba'  │ 0.6ms  │ 0.7ms  │   1.16 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'size'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.15 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'min'      │ 'direct'      │       1 │ 'numba'  │ 0.9ms  │ 1.1ms  │   1.15 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'shift'    │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.15 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'first'    │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'tail'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'head'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cumprod'  │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.14 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'float'  │ 'max'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.14 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'last'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'unique'   │ 'direct'      │       1 │ 'cython' │ 61.1ms │ 69.1ms │   1.13 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'var'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'size'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'tail'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.13 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'object' │ 'all'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.12 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'std'      │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.12 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'cumsum'   │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.12 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'ffill'    │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.12 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'sem'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.12 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'bfill'    │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'tail'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int'    │ 'skew'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'rank'     │ 'direct'      │       1 │ 'cython' │ 0.4ms  │ 0.4ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'std'      │ 'direct'      │       1 │ 'numba'  │ 0.7ms  │ 0.8ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'head'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'var'      │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.11 │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'uint'   │ 'skew'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'skew'     │ 'direct'      │       1 │ 'cython' │ 0.1ms  │ 0.1ms  │   1.1  │
├──────────┼────────────┼───────────────┼─────────┼──────────┼────────┼────────┼────────┤
│ 'int16'  │ 'sum'      │ 'direct'      │       1 │ 'cython' │ 0.2ms  │ 0.2ms  │   1.1  │
╘══════════╧════════════╧═══════════════╧═════════╧══════════╧════════╧════════╧════════╛

groupby.GroupByNumbaAgg.time_frame_agg
╒═══════════╤══════════╤═════════╤═════════╤════════╕
│ dtype     │ method   │ main    │ pr      │   frac │
╞═══════════╪══════════╪═════════╪═════════╪════════╡
│ 'float64' │ 'mean'   │ 193.7ms │ 219.9ms │   1.13 │
╘═══════════╧══════════╧═════════╧═════════╧════════╛

groupby.RankWithTies.time_rank_ties
╒═══════════╤══════════════╤════════╤═══════╤════════╕
│ dtype     │ tie_method   │ main   │ pr    │   frac │
╞═══════════╪══════════════╪════════╪═══════╪════════╡
│ 'float64' │ 'first'      │ 0.9ms  │ 1.0ms │   1.14 │
╘═══════════╧══════════════╧════════╧═══════╧════════╛

groupby.String.time_str_func
╒══════════════════╤══════════╤════════╤═════════╤════════╕
│ dtype            │ method   │ main   │ pr      │   frac │
╞══════════════════╪══════════╪════════╪═════════╪════════╡
│ 'str'            │ 'all'    │ 7.8ms  │ 9.9ms   │   1.28 │
├──────────────────┼──────────┼────────┼─────────┼────────┤
│ 'str'            │ 'last'   │ 4.9ms  │ 5.8ms   │   1.17 │
├──────────────────┼──────────┼────────┼─────────┼────────┤
│ 'str'            │ 'any'    │ 7.5ms  │ 8.6ms   │   1.14 │
├──────────────────┼──────────┼────────┼─────────┼────────┤
│ 'string[python]' │ 'sum'    │ 14.0ms │ 15.8ms  │   1.13 │
├──────────────────┼──────────┼────────┼─────────┼────────┤
│ 'string[python]' │ 'all'    │ 9.4ms  │ 10.4ms  │   1.1  │
├──────────────────┼──────────┼────────┼─────────┼────────┤
│ 'string[python]' │ 'min'    │ 99.0ms │ 109.2ms │   1.1  │
╘══════════════════╧══════════╧════════╧═════════╧════════╛

groupby.SumMultiLevel.time_groupby_sum_multiindex
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 0.6ms  │ 0.7ms │   1.12 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_multi_key2
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 6.6ms  │ 7.3ms │    1.1 │
╘════════╧═══════╧════════╛

groupby.Transform.time_transform_multi_key4
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 2.6ms  │ 2.8ms │    1.1 │
╘════════╧═══════╧════════╛

rolling.GroupbyEWM.time_groupby_method
╒══════════╤════════╤═══════╤════════╕
│ method   │ main   │ pr    │   frac │
╞══════════╪════════╪═══════╪════════╡
│ 'var'    │ 1.3ms  │ 1.4ms │    1.1 │
╘══════════╧════════╧═══════╧════════╛

rolling.GroupbyEWMEngine.time_groupby_mean
╒══════════╤════════╤═══════╤════════╕
│ engine   │ main   │ pr    │   frac │
╞══════════╪════════╪═══════╪════════╡
│ 'cython' │ 1.3ms  │ 1.5ms │   1.15 │
╘══════════╧════════╧═══════╧════════╛

rolling.Pairwise.time_groupby
╒═══════════════════════════════╤══════════╤════════════╤════════╤════════╤════════╕
│ window_kwargs                 │ method   │ pairwise   │ main   │ pr     │   frac │
╞═══════════════════════════════╪══════════╪════════════╪════════╪════════╪════════╡
│ ({}, 'expanding')             │ 'corr'   │ False      │ 25.3ms │ 30.2ms │   1.19 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({}, 'expanding')             │ 'cov'    │ False      │ 23.9ms │ 27.1ms │   1.13 │
├───────────────────────────────┼──────────┼────────────┼────────┼────────┼────────┤
│ ({'window': 1000}, 'rolling') │ 'corr'   │ False      │ 25.9ms │ 28.7ms │   1.11 │
╘═══════════════════════════════╧══════════╧════════════╧════════╧════════╧════════╛

groupby.AggFunctions.time_different_numpy_functions
╒════════╤════════╤════════╕
│ main   │ pr     │   frac │
╞════════╪════════╪════════╡
│ 12.6ms │ 14.1ms │   1.12 │
╘════════╧════════╧════════╛

groupby.CountMultiInt.time_multi_int_count
╒════════╤═══════╤════════╕
│ main   │ pr    │   frac │
╞════════╪═══════╪════════╡
│ 2.0ms  │ 2.3ms │   1.12 │
╘════════╧═══════╧════════╛

groupby.Groups.time_series_groups
╒════════════════╤═════════╤═════════╤════════╕
│ key            │ main    │ pr      │   frac │
╞════════════════╪═════════╪═════════╪════════╡
│ 'object_small' │ 61.6ms  │ 70.7ms  │   1.15 │
├────────────────┼─────────┼─────────┼────────┤
│ 'int64_small'  │ 31.3ms  │ 35.7ms  │   1.14 │
├────────────────┼─────────┼─────────┼────────┤
│ 'int64_large'  │ 93.8ms  │ 105.6ms │   1.13 │
├────────────────┼─────────┼─────────┼────────┤
│ 'object_large' │ 163.0ms │ 180.3ms │   1.11 │
╘════════════════╧═════════╧═════════╧════════╛

groupby.Groups.time_series_indices
╒════════════════╤═════════╤═════════╤════════╕
│ key            │ main    │ pr      │   frac │
╞════════════════╪═════════╪═════════╪════════╡
│ 'object_large' │ 123.2ms │ 139.4ms │   1.13 │
╘════════════════╧═════════╧═════════╧════════╛

@WillAyd
Copy link
Member

WillAyd commented Jun 26, 2023

Cool thanks for providing those. That's a decent amount of performance regression. I know this was discussed on the @pandas-dev/pandas-core call so ultimately up to the group

@rhshadrach
Copy link
Member

That's a decent amount of performance regression.

A lot looks like noise, no?

@WillAyd
Copy link
Member

WillAyd commented Jun 27, 2023

Hmm not sure. I don't know what stable sort implementations are actually being deferred to but I would think NumPy chose a quicksort as the default for CPU and memory efficiency

@github-actions
Copy link
Contributor

This pull request is stale because it has been open for thirty days with no activity. Please update and respond to this comment if you're still interested in working on this.

@github-actions github-actions bot added the Stale label Jul 28, 2023
@MarcoGorelli
Copy link
Member

I don't know what stable sort implementations are actually being deferred to but I would think NumPy chose a quicksort as the default

I'm no expert here, but isn't quicksort unstable?

It's true that this was discussed on the call, but to be honest I hadn't appreciated the perf implications, and feel a bit uneasy about them. Can't really tell how much noise there is in the results though - @rhshadrach just for my understanding, how do you determine that?

@jreback
Copy link
Contributor

jreback commented Aug 4, 2023

quicksort is not stable but mergesort is

@WillAyd
Copy link
Member

WillAyd commented Aug 4, 2023

Wikipedia has a pretty nice summary of the different algorithms:

https://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms

If you wanted to go really deep Knuth's the Art of Computer Programming Volume 3 is a great resource

@rhshadrach
Copy link
Member

Can't really tell how much noise there is in the results though - @rhshadrach just for my understanding, how do you determine that?

Best way is to do multiple runs to start narrowing it down. I'd consider < 5% suspect.

@rhshadrach
Copy link
Member

@Charlie-XIAO can you merge main again; I'd like to run some more profiling

@Charlie-XIAO
Copy link
Contributor Author

@rhshadrach Sure, merged now.

@rhshadrach
Copy link
Member

I ran the following two commands:

asv continuous -f 1.1 upstream/main HEAD -a rounds=4
asv compare upstream/main HEAD --factor 1.1 --only-changed --sort ratio

For some reason I no longer get a summary at the end of the output for the first command.

Output
| Change   | Before [31d4d8b5] <main>   | After [5b87229d] <sort-stable-internal>   |   Ratio | Benchmark (Parameter)                                                                                                |
|----------|----------------------------|-------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------|
| +        | 349±20μs                   | 429±20μs                                  |    1.23 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function eq>)            |
| +        | 354±10μs                   | 427±30μs                                  |    1.21 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function gt>)          |
| +        | 664±50μs                   | 785±60μs                                  |    1.18 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function truediv>)     |
| +        | 8.25±0.09μs                | 9.69±1μs                                  |    1.17 | timeseries.TzLocalize.time_infer_dst('UTC')                                                                          |
| +        | 104±3ns                    | 117±2ns                                   |    1.12 | tslibs.timestamp.TimestampProperties.time_is_quarter_end(tzlocal())                                                  |
| +        | 45.1±1μs                   | 49.9±0.6μs                                |    1.11 | hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'numpy.float64'>, 1000000)                                |
| +        | 6.48±0.1ms                 | 7.16±0.1ms                                |    1.11 | index_object.SetOperations.time_operation('monotonic', 'date_string', 'union')                                       |
| +        | 7.96±0.2ms                 | 8.79±0.2ms                                |    1.1  | io.csv.ReadCSVSkipRows.time_skipprows(None, 'c')                                                                     |
| +        | 103±3ns                    | 113±2ns                                   |    1.1  | tslibs.timestamp.TimestampProperties.time_is_quarter_end(datetime.timezone(datetime.timedelta(seconds=3600)))        |
| -        | 300±10μs                   | 273±10μs                                  |    0.91 | arithmetic.OpWithFillValue.time_frame_op_with_fill_value_no_nas                                                      |
| -        | 283±7μs                    | 256±5μs                                   |    0.91 | groupby.GroupByMethods.time_dtype_as_group('int16', 'min', 'direct', 1, 'numba')                                     |
| -        | 331±7μs                    | 301±6μs                                   |    0.91 | groupby.GroupByMethods.time_dtype_as_group('int16', 'std', 'direct', 1, 'numba')                                     |
| -        | 1.16±0.03ms                | 1.05±0.02ms                               |    0.9  | frame_ctor.FromArrays.time_frame_from_arrays_float                                                                   |
| -        | 1.84±0.09ms                | 1.65±0.04ms                               |    0.9  | frame_methods.Fillna.time_ffill(True, 'Int64')                                                                       |
| -        | 282±5μs                    | 253±5μs                                   |    0.9  | groupby.GroupByMethods.time_dtype_as_group('int16', 'max', 'direct', 1, 'numba')                                     |
| -        | 6.42±0.1ms                 | 5.74±0.3ms                                |    0.89 | algos.isin.IsinWithArange.time_isin(<class 'numpy.object_'>, 2000, -2)                                               |
| -        | 1.91±0.06ms                | 1.71±0.04ms                               |    0.89 | frame_methods.Reindex.time_reindex_axis0                                                                             |
| -        | 154±2μs                    | 136±1μs                                   |    0.89 | index_cached_properties.IndexCache.time_is_monotonic_decreasing('UInt64Index')                                       |
| -        | 9.49±0.2ms                 | 8.42±0.1ms                                |    0.89 | stat_ops.FrameOps.time_op('prod', 'Int64', 1)                                                                        |
| -        | 10.2±0.2ms                 | 9.10±0.2ms                                |    0.89 | stat_ops.FrameOps.time_op('std', 'Int64', 1)                                                                         |
| -        | 10.1±0.2ms                 | 9.00±0.3ms                                |    0.89 | stat_ops.FrameOps.time_op('var', 'Int64', 1)                                                                         |
| -        | 171±10μs                   | 153±2μs                                   |    0.89 | tslibs.normalize.Normalize.time_is_date_array_normalized(10000, datetime.timezone(datetime.timedelta(seconds=3600))) |
| -        | 291±20μs                   | 257±6μs                                   |    0.88 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function le>)            |
| -        | 155±2μs                    | 136±1μs                                   |    0.88 | index_cached_properties.IndexCache.time_is_monotonic_increasing('UInt64Index')                                       |
| -        | 9.94±0.3ms                 | 8.72±0.2ms                                |    0.88 | stat_ops.FrameOps.time_op('mean', 'Int64', 1)                                                                        |
| -        | 10.5±0.3ms                 | 9.18±0.09ms                               |    0.87 | stat_ops.FrameOps.time_op('sem', 'Int64', 1)                                                                         |
| -        | 6.95±0.2ms                 | 5.98±0.1ms                                |    0.86 | algorithms.Factorize.time_factorize(False, True, 'uint')                                                             |
| -        | 742±70ns                   | 641±30ns                                  |    0.86 | index_cached_properties.IndexCache.time_values('TimedeltaIndex')                                                     |
| -        | 453±20μs                   | 384±20μs                                  |    0.85 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function gt>)          |
| -        | 424±30μs                   | 362±20μs                                  |    0.85 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function lt>)          |
| -        | 19.2±0.2ms                 | 16.3±0.1ms                                |    0.85 | groupby.Apply.time_copy_function_multi_col(5)                                                                        |
| -        | 140±0.5μs                  | 119±0.6μs                                 |    0.85 | index_cached_properties.IndexCache.time_is_monotonic_decreasing('CategoricalIndex')                                  |
| -        | 140±0.8μs                  | 119±0.6μs                                 |    0.85 | index_cached_properties.IndexCache.time_is_monotonic_increasing('CategoricalIndex')                                  |
| -        | 7.03±0.05ms                | 5.81±0.1ms                                |    0.83 | algorithms.Factorize.time_factorize(False, True, 'int')                                                              |
| -        | 392±9μs                    | 324±40μs                                  |    0.83 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function eq>)        |
| -        | 5.72±0.04ms                | 4.76±0.08ms                               |    0.83 | groupby.Nth.time_groupby_nth_all('object')                                                                           |
| -        | 21.5±0.4ms                 | 17.6±0.2ms                                |    0.82 | frame_methods.Fillna.time_bfill(True, 'object')                                                                      |
| -        | 466±1μs                    | 383±3μs                                   |    0.82 | groupby.Datelike.time_sum('period_range')                                                                            |
| -        | 1.65±0.02ms                | 1.36±0.07ms                               |    0.82 | multiindex_object.SetOperations.time_operation('monotonic', 'ea_int', 'intersection', False)                         |
| -        | 941±20μs                   | 767±10μs                                  |    0.82 | period.DataFramePeriodColumn.time_set_index                                                                          |
| -        | 5.32±0.4ms                 | 4.23±0.5ms                                |    0.8  | algorithms.Factorize.time_factorize(False, True, 'Int64')                                                            |
| -        | 409±5μs                    | 326±4μs                                   |    0.8  | categoricals.Constructor.time_datetimes                                                                              |
| -        | 413±4μs                    | 330±7μs                                   |    0.8  | categoricals.Constructor.time_datetimes_with_nat                                                                     |
| -        | 18.8±1ms                   | 15.1±0.6ms                                |    0.8  | categoricals.RemoveCategories.time_remove_categories                                                                 |
| -        | 10.4±0.04ms                | 8.31±0.09ms                               |    0.8  | indexing.InsertColumns.time_insert                                                                                   |
| -        | 91.0±1μs                   | 72.1±0.7μs                                |    0.79 | index_cached_properties.IndexCache.time_is_monotonic_decreasing('Float64Index')                                      |
| -        | 10.6±0.2ms                 | 8.40±0.1ms                                |    0.79 | index_object.SetOperations.time_operation('non_monotonic', 'strings', 'intersection')                                |
| -        | 1.78±0.05ms                | 1.40±0.04ms                               |    0.79 | multiindex_object.SetOperations.time_operation('non_monotonic', 'datetime', 'intersection', False)                   |
| -        | 1.78±0.04ms                | 1.42±0.05ms                               |    0.79 | multiindex_object.SetOperations.time_operation('non_monotonic', 'int', 'intersection', False)                        |
| -        | 9.67±0.1ms                 | 7.57±0.08ms                               |    0.78 | groupby.Nth.time_frame_nth_any('object')                                                                             |
| -        | 92.3±0.8μs                 | 72.1±0.7μs                                |    0.78 | index_cached_properties.IndexCache.time_is_monotonic_increasing('Float64Index')                                      |
| -        | 8.64±0.1ms                 | 6.65±0.08ms                               |    0.77 | groupby.Nth.time_series_nth_all('object')                                                                            |
| -        | 8.54±0.07ms                | 6.59±0.08ms                               |    0.77 | groupby.Nth.time_series_nth_any('object')                                                                            |
| -        | 11.6±0.2ms                 | 8.92±0.1ms                                |    0.77 | index_object.SetOperations.time_operation('non_monotonic', 'date_string', 'intersection')                            |
| -        | 476±40μs                   | 361±40μs                                  |    0.76 | arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ge>)          |
| -        | 1.58±0.01ms                | 1.20±0.02ms                               |    0.76 | multiindex_object.SetOperations.time_operation('monotonic', 'string', 'intersection', False)                         |
| -        | 1.85±0.02ms                | 1.40±0.04ms                               |    0.76 | multiindex_object.SetOperations.time_operation('non_monotonic', 'ea_int', 'intersection', False)                     |
| -        | 1.71±0.02ms                | 1.29±0.03ms                               |    0.76 | multiindex_object.SetOperations.time_operation('non_monotonic', 'string', 'intersection', False)                     |
| -        | 1.71±0.04ms                | 1.29±0.04ms                               |    0.75 | multiindex_object.SetOperations.time_operation('monotonic', 'datetime', 'intersection', False)                       |
| -        | 1.73±0.03ms                | 1.30±0.03ms                               |    0.75 | multiindex_object.SetOperations.time_operation('monotonic', 'int', 'intersection', False)                            |
| -        | 12.7±0.08ms                | 9.39±0.04ms                               |    0.74 | groupby.Apply.time_copy_overhead_single_col(5)                                                                       |
| -        | 3.79±0.08ms                | 2.81±0.09ms                               |    0.74 | groupby.Nth.time_groupby_nth_all('float32')                                                                          |
| -        | 3.78±0.2ms                 | 2.78±0.2ms                                |    0.74 | groupby.Nth.time_groupby_nth_all('float64')                                                                          |
| -        | 7.61±0.06ms                | 5.58±0.04ms                               |    0.73 | groupby.Nth.time_frame_nth_any('datetime')                                                                           |
| -        | 7.38±0.09ms                | 5.37±0.03ms                               |    0.73 | groupby.Nth.time_frame_nth_any('float32')                                                                            |
| -        | 7.42±0.1ms                 | 5.42±0.1ms                                |    0.73 | groupby.Nth.time_frame_nth_any('float64')                                                                            |
| -        | 3.79±0.3ms                 | 2.78±0.3ms                                |    0.73 | groupby.Nth.time_groupby_nth_all('datetime')                                                                         |
| -        | 3.66±0.04ms                | 2.66±0.04ms                               |    0.73 | groupby.Nth.time_series_nth('datetime')                                                                              |
| -        | 10.6±0.2ms                 | 7.70±0.07ms                               |    0.72 | frame_methods.SortMultiKey.time_sort_values(True)                                                                    |
| -        | 3.55±0.06ms                | 2.55±0.06ms                               |    0.72 | groupby.Nth.time_frame_nth('datetime')                                                                               |
| -        | 3.57±0.1ms                 | 2.56±0.1ms                                |    0.72 | groupby.Nth.time_frame_nth('object')                                                                                 |
| -        | 3.68±0.06ms                | 2.65±0.05ms                               |    0.72 | groupby.Nth.time_series_nth('float64')                                                                               |
| -        | 3.63±0.03ms                | 2.62±0.04ms                               |    0.72 | groupby.Nth.time_series_nth('object')                                                                                |
| -        | 6.98±0.1ms                 | 5.00±0.1ms                                |    0.72 | groupby.Nth.time_series_nth_any('float64')                                                                           |
| -        | 1.36±0.02ms                | 972±20μs                                  |    0.72 | index_object.SetOperations.time_operation('non_monotonic', 'ea_int', 'intersection')                                 |
| -        | 2.92±0.5ms                 | 2.08±0.4ms                                |    0.71 | arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('sub')                                           |
| -        | 3.56±0.02ms                | 2.52±0.03ms                               |    0.71 | groupby.Nth.time_frame_nth('float64')                                                                                |
| -        | 3.47±0.03ms                | 2.46±0.02ms                               |    0.71 | groupby.Nth.time_series_nth('float32')                                                                               |
| -        | 7.04±0.09ms                | 5.00±0.09ms                               |    0.71 | groupby.Nth.time_series_nth_all('datetime')                                                                          |
| -        | 6.98±0.1ms                 | 4.95±0.1ms                                |    0.71 | groupby.Nth.time_series_nth_all('float64')                                                                           |
| -        | 2.74±0.03ms                | 1.94±0.03ms                               |    0.71 | index_object.UnionWithDuplicates.time_union_with_duplicates                                                          |
| -        | 3.41±0.04ms                | 2.40±0.02ms                               |    0.7  | groupby.Nth.time_frame_nth('float32')                                                                                |
| -        | 7.03±0.08ms                | 4.92±0.07ms                               |    0.7  | groupby.Nth.time_series_nth_any('datetime')                                                                          |
| -        | 6.56±0.06ms                | 4.57±0.05ms                               |    0.7  | groupby.Nth.time_series_nth_any('float32')                                                                           |
| -        | 6.61±0.06ms                | 4.58±0.07ms                               |    0.69 | groupby.Nth.time_series_nth_all('float32')                                                                           |
| -        | 1.24±0.01ms                | 848±10μs                                  |    0.69 | index_object.SetOperations.time_operation('non_monotonic', 'int', 'intersection')                                    |
| -        | 1.59±0.01ms                | 1.06±0.01ms                               |    0.67 | groupby.Categories.time_groupby_ordered_sort(True)                                                                   |
| -        | 27.9±0.2ms                 | 18.6±0.3ms                                |    0.67 | join_merge.MergeOrdered.time_merge_ordered                                                                           |
| -        | 1.61±0.02ms                | 1.07±0.01ms                               |    0.66 | groupby.Categories.time_groupby_sort(True)                                                                           |
| -        | 30.9±0.2ms                 | 19.1±0.1ms                                |    0.62 | algorithms.Factorize.time_factorize(False, True, 'object')                                                           |
| -        | 2.50±0.02ms                | 1.51±0.02ms                               |    0.61 | algorithms.Factorize.time_factorize(True, True, 'Int64')                                                             |
| -        | 1.26±0.01ms                | 766±6μs                                   |    0.61 | index_object.SetDisjoint.time_datetime_difference_disjoint                                                           |
| -        | 2.14±0.08ms                | 1.20±0.09ms                               |    0.56 | index_object.SetOperations.time_operation('non_monotonic', 'ea_int', 'union')                                        |
| -        | 2.04±0.01ms                | 1.12±0.02ms                               |    0.55 | algorithms.Factorize.time_factorize(True, True, 'uint')                                                              |
| -        | 2.15±0.01ms                | 1.16±0.01ms                               |    0.54 | algorithms.Factorize.time_factorize(True, True, 'int')                                                               |
| -        | 84.8±40μs                  | 45.8±0.4μs                                |    0.54 | timeseries.DatetimeIndex.time_timeseries_is_month_start('dst')                                                       |
| -        | 16.8±0.3ms                 | 8.93±0.7ms                                |    0.53 | strings.Methods.time_count('string[pyarrow]')                                                                        |
| -        | 11.2±0.1ms                 | 5.60±0.03ms                               |    0.5  | rolling.GroupbyLargeGroups.time_rolling_multiindex_creation                                                          |
| -        | 1.62±0.01ms                | 750±10μs                                  |    0.46 | index_object.SetOperations.time_operation('non_monotonic', 'int', 'union')                                           |
| -        | 18.1±0.2ms                 | 5.98±0.04ms                               |    0.33 | algorithms.Factorize.time_factorize(True, True, 'object')                                                            |
| -        | 51.7±1ms                   | 12.2±0.2ms                                |    0.24 | index_object.SetOperations.time_operation('non_monotonic', 'date_string', 'union')                                   |
| -        | 16.5±0.2ms                 | 1.46±0.03ms                               |    0.09 | strings.Methods.time_find('string[pyarrow]')                                                                         |                                         

@rhshadrach
Copy link
Member

rhshadrach commented Sep 7, 2023

I think the benchmarks above can be explained by timsort's good performance on already sorted (or almost sorted) data:

size = 10_000_000
arr = np.arange(size)

%timeit np.sort(arr, kind='quicksort')
# 69.8 ms ± 341 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit np.sort(arr, kind='stable')
# 15.2 ms ± 194 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

However, I haven't checked whether these tests have sorted inputs.

@WillAyd
Copy link
Member

WillAyd commented Sep 7, 2023

Oh wow that is an interesting. I'm guessing for non-sorted quicksort is still faster?

In [9]: data = np.random.rand(size)

In [10]: %timeit np.sort(data, kind="quicksort")
750 ms ± 12.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [11]: %timeit np.sort(data, kind="stable")
878 ms ± 2.04 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

I wonder if there is a way to identify where we expect one sorting method to generally be better than the other

@rhshadrach
Copy link
Member

I wonder if there is a way to identify where we expect one sorting method to generally be better than the other

I did a bit of searching, but not finding anyone doing this for timsort/quicksort specifically. There are other hybrid algorithms like fluxsort that are in this spirit, but doing things which are must more advanced than say taking a linear pass to decide between timsort and quicksort.

@WillAyd
Copy link
Member

WillAyd commented Sep 10, 2023

I meant moreso in our codebase; if we think something is mostly sorted when hitting a certain codepath then the timsort would probably be better, if it is ever reasonable to make that assumption

@mroeschke
Copy link
Member

Sounds like we need more discussion in the issue before moving forward with a PR so closing this for now

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Should internal usages of sorting with numpy use kind="stable"?
6 participants