Skip to content
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

Refactor - ArrayManager overview issue #39146

Closed
5 of 11 tasks
jorisvandenbossche opened this issue Jan 13, 2021 · 13 comments
Closed
5 of 11 tasks

Refactor - ArrayManager overview issue #39146

jorisvandenbossche opened this issue Jan 13, 2021 · 13 comments
Labels
Internals Related to non-user accessible pandas implementation Refactor Internal refactoring of code

Comments

@jorisvandenbossche
Copy link
Member

jorisvandenbossche commented Jan 13, 2021

Related to the discussion in #10556, and following up on the mailing list discussion "A case for a simplified (non-consolidating) BlockManager with 1D blocks" (archive).

Initial proof of concept for a non-consolidating "ArrayManager" (storing the columns of a DataFrame as a list of 1D arrays instead of blocks) is merged in #36010.

This issue is meant to track the required follow-up work items to get this to a more feature-complete implementation.

@jorisvandenbossche
Copy link
Member Author

One design question that was still left open is what to do with Series, for which we currently have a SingleBlockManager. The two obvious options I can think of:

  • Do something similar and also have a "SingleArrayManager" class
  • Directly store the array on the Series without involving a manager object

A while ago I thought the second option could be an attractive simplification (because in the end, a Series "just" consists of an array and an index, so why needing a manager?). But that was probably a bit naive ;) The Manager still does quite some things, and moreover, doing a SingleArrayManager keeps the changes more limited (we can still see later if getting rid of Single(Block/Array)Manager is an option we want to explore, independent from the BlockManager vs ArrayManager debate) and for implementing certain features consistently between Series and DataFrame, having both with an underlying manager is probably useful.

Now, for the actual SingleArrayManager, some thoughts:

  • For SingleBlockManager, that's actually a subclass of BlockManager. But many methods of the BlockManager are not written to work with SingleBlockManager, which means you have quite some methods on the SingleBlockManager that are never used / would error if used. Which I don't find a very nice design pattern. An alternative for SingleArrayManager could be to not subclass ArrayManager itself (but only a base Manager class). We could of course still have a mixin to share those parts that can be shared.
  • I was wondering if we could actually "just" reuse the ArrayManager for Series as well, in which case it would store a single array (list of arrays with length 1). So the underlying storage would be the same as for a DataFrame of 1 column. But, I suppose that storing the name of the Series as a len-1 Index probably gives quite some overhead (and in addition we already have many places that explicitly does "name resolution" to determine the name of the resulting series, so that might give bigger changes)

I am currently testing out the approach of a separate SingleArrayManager class to see what is needed to implement it fully.

cc @jreback @jbrockmendel @TomAugspurger

@jorisvandenbossche
Copy link
Member Author

jorisvandenbossche commented Mar 15, 2021

Some more benchmark results:

groupby

$ asv continuous -f 1.01 -b groupby HEAD~1 HEAD
       before           after         ratio
     [c9628cbd]       [707df345]
     <am-benchmarks~1>       <am-benchmarks>
+     3.83±0.02ms       61.6±0.2ms    16.07  groupby.GroupManyLabels.time_sum(1000)
+     8.23±0.05ms      21.4±0.06ms     2.60  groupby.Apply.time_scalar_function_single_col(4)
+      23.9±0.1ms       59.6±0.2ms     2.49  groupby.Apply.time_scalar_function_multi_col(4)
+      51.8±0.4ms       58.4±0.5ms     1.13  groupby.GroupByCythonAgg.time_frame_agg('float64', 'max')
+         267±1μs          300±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct')
+         266±2μs          299±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'transformation')
+       278±0.8μs        313±0.9μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'transformation')
+         279±1μs          313±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'direct')
+      6.54±0.1ms      7.24±0.09ms     1.11  groupby.Apply.time_scalar_function_single_col(5)
+      66.9±0.6ms         70.1±1ms     1.05  groupby.GroupByCythonAgg.time_frame_agg('float64', 'var')
-         273±1μs          271±2μs     0.99  groupby.GroupByMethods.time_dtype_as_field('float', 'tail', 'direct')
-     28.0±0.07ms       27.7±0.2ms     0.99  groupby.AggEngine.time_series_cython(False)
-       114±0.2ms        112±0.7ms     0.98  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'direct')
-         517±2μs        509±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'bfill', 'transformation')
-         447±4μs          439±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'median', 'direct')
-         363±2μs          356±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'direct')
-         505±3μs          495±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'nunique', 'transformation')
-         363±3μs        356±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'transformation')
-         860±4μs        844±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'value_counts', 'transformation')
-         519±1μs          509±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'ffill', 'transformation')
-         477±2μs          467±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'nunique', 'direct')
-         333±2μs        326±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'bfill', 'transformation')
-         356±1μs          348±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct')
-         545±2μs        533±0.3μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'quantile', 'transformation')
-         461±2μs          451±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'nunique', 'transformation')
-     6.59±0.02ms      6.44±0.02ms     0.98  groupby.Transform.time_transform_multi_key3
-         333±2μs        325±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'ffill', 'direct')
-         478±1μs        466±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'nunique', 'transformation')
-         561±5μs          548±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'quantile', 'direct')
-         584±3μs          570±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'rank', 'direct')
-         378±3μs        369±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'first', 'direct')
-         569±3μs          555±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'quantile', 'direct')
-         358±1μs        349±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'ffill', 'transformation')
-         525±2μs        512±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'nunique', 'direct')
-         449±3μs        438±0.6μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'direct')
-         440±6μs          428±2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'transformation')
-         367±1μs          357±2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('object', 'nunique', 'direct')
-         531±1μs          517±2μs     0.97  groupby.GroupByMethods.time_dtype_as_field('datetime', 'quantile', 'direct')
-         436±3μs        423±0.9μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'transformation')
-         429±3μs          416±1μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'sum', 'transformation')
-         527±4μs        512±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'nunique', 'transformation')
-         224±3μs        218±0.6μs     0.97  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'direct')
-     1.22±0.01ms         1.19±0ms     0.97  groupby.GroupByMethods.time_dtype_as_field('float', 'pct_change', 'direct')
-         256±2μs          248±2μs     0.97  groupby.GroupByMethods.time_dtype_as_field('float', 'min', 'direct')
-       294±0.7μs          285±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'transformation')
-         977±2μs          948±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('datetime', 'value_counts', 'transformation')
-      30.3±0.1ms       29.4±0.2ms     0.97  groupby.AggEngine.time_dataframe_cython(False)
-         405±4μs          393±2μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'mean', 'transformation')
-         402±3μs        390±0.4μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'transformation')
-         443±3μs          429±2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'transformation')
-         429±4μs        416±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'transformation')
-         454±2μs          440±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'direct')
-         229±2μs        221±0.9μs     0.97  groupby.GroupByMethods.time_dtype_as_group('datetime', 'head', 'transformation')
-         285±3μs          275±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct')
-         370±3μs          358±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('object', 'nunique', 'transformation')
-         253±3μs          245±2μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'cummax', 'direct')
-       366±0.8μs        353±0.8μs     0.97  groupby.GroupByMethods.time_dtype_as_field('object', 'last', 'direct')
-         296±3μs        286±0.8μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'transformation')
-       365±0.9μs        353±0.5μs     0.97  groupby.GroupByMethods.time_dtype_as_field('object', 'last', 'transformation')
-         296±1μs          286±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'direct')
-         564±2μs          544±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'quantile', 'direct')
-         316±3μs          304±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'transformation')
-         415±3μs        400±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'prod', 'direct')
-        986±10μs          950±3μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'value_counts', 'direct')
-         441±6μs          424±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct')
-         296±4μs          285±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'transformation')
-         297±3μs        286±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct')
-         298±2μs          287±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'transformation')
-         294±2μs          283±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'transformation')
-         293±2μs          281±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'var', 'transformation')
-         296±3μs          285±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct')
-         293±3μs        282±0.7μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'max', 'transformation')
-       224±0.9μs          215±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation')
-         226±3μs          217±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'transformation')
-         271±3μs          260±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'cumcount', 'direct')
-         253±2μs          243±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'direct')
-         295±1μs          284±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'direct')
-         297±3μs          286±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct')
-         270±2μs          259±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'cumcount', 'transformation')
-         286±4μs          275±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'transformation')
-         272±3μs        261±0.8μs     0.96  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct')
-         226±3μs        217±0.7μs     0.96  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct')
-     4.29±0.01ms      4.12±0.01ms     0.96  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'std')
-         299±2μs          287±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct')
-         270±1μs        260±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cumcount', 'direct')
-         246±1μs          236±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'last', 'direct')
-       224±0.8μs        215±0.6μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'direct')
-     4.32±0.02ms      4.15±0.03ms     0.96  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'skew')
-         259±2μs          249±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'direct')
-         567±4μs          544±3μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'quantile', 'transformation')
-         257±1μs        247±0.6μs     0.96  groupby.GroupByMethods.time_dtype_as_field('object', 'count', 'transformation')
-         202±1μs          194±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'direct')
-         270±1μs        259±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cumcount', 'transformation')
-         298±2μs          285±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct')
-         271±2μs        259±0.8μs     0.96  groupby.GroupByMethods.time_dtype_as_field('object', 'cumcount', 'direct')
-         243±2μs          233±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'prod', 'transformation')
-         282±3μs          270±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'last', 'direct')
-         277±1μs          265±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'median', 'direct')
-     8.42±0.03ms      8.06±0.01ms     0.96  groupby.CountMultiInt.time_multi_int_nunique
-       163±0.8μs        156±0.7μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'all', 'direct')
-     4.49±0.01ms      4.30±0.02ms     0.96  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'count')
-       219±0.9μs          210±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'cumsum', 'transformation')
-         238±3μs          227±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'transformation')
-       590±0.6μs        565±0.7μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'rank', 'transformation')
-         241±2μs        230±0.5μs     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct')
-         215±1μs        205±0.8μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'transformation')
-         248±1μs          237±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'direct')
-     4.30±0.02ms      4.12±0.02ms     0.96  rolling.ExpandingMethods.time_expanding_groupby('Series', 'int', 'skew')
-         493±2μs          471±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'transformation')
-         251±3μs        240±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'cummin', 'direct')
-         450±3μs          430±3μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'direct')
-         259±3μs          247±2μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'max', 'transformation')
-         271±1μs          259±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'cumcount', 'direct')
-     4.27±0.02ms      4.08±0.03ms     0.96  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'sum')
-         237±2μs          226±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct')
-       212±0.5μs          202±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'cumprod', 'direct')
-         328±1μs          313±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('datetime', 'min', 'direct')
-         246±3μs          235±1μs     0.96  groupby.GroupByMethods.time_dtype_as_field('float', 'last', 'transformation')
-         275±1μs          262±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'cumcount', 'direct')
-         592±2μs          565±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('datetime', 'rank', 'direct')
-         247±2μs        236±0.9μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'transformation')
-         297±2μs        284±0.5μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'transformation')
-     4.23±0.01ms      4.04±0.02ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('Series', 'int', 'min')
-     4.27±0.04ms      4.07±0.01ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('Series', 'int', 'sum')
-       164±0.5μs          156±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct')
-         469±3μs          448±2μs     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'unique', 'direct')
-         272±1μs          260±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('object', 'cumcount', 'transformation')
-         256±2μs          245±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'first', 'direct')
-     4.33±0.02ms      4.13±0.02ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'median')
-       164±0.8μs        156±0.8μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct')
-     4.29±0.01ms      4.09±0.04ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'mean')
-         299±2μs          285±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'transformation')
-       223±0.5μs        212±0.9μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'var', 'direct')
-       215±0.6μs          205±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'direct')
-         495±1μs        472±0.7μs     0.95  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'direct')
-         666±2μs          634±2μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct')
-         672±2μs          641±3μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct')
-         250±1μs        238±0.3μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'sum', 'transformation')
-       245±0.6μs        234±0.7μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'transformation')
-         670±2μs          638±2μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'transformation')
-         245±2μs        234±0.8μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'direct')
-         250±1μs          238±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'sum', 'direct')
-     3.17±0.02ms      3.02±0.03ms     0.95  groupby.CountMultiInt.time_multi_int_count
-         219±1μs          208±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'cumsum', 'direct')
-         163±2μs        156±0.8μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'transformation')
-     4.25±0.02ms      4.05±0.02ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('Series', 'int', 'max')
-         244±1μs          232±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'prod', 'direct')
-         673±2μs        640±0.9μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'transformation')
-         246±1μs          234±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'direct')
-       162±0.6μs          154±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'all', 'transformation')
-       329±0.7μs          313±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('datetime', 'first', 'direct')
-         162±1μs          154±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'direct')
-         329±1μs          313±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('datetime', 'first', 'transformation')
-       246±0.6μs          234±2μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'transformation')
-       166±0.6μs          157±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'all', 'direct')
-         260±2μs          247±2μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'transformation')
-     4.24±0.02ms      4.03±0.03ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'max')
-       211±0.8μs        200±0.4μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'cumprod', 'transformation')
-       226±0.6μs        214±0.7μs     0.95  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'transformation')
-         317±2μs          301±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('datetime', 'max', 'transformation')
-         235±2μs        223±0.6μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'mean', 'direct')
-         162±3μs        153±0.6μs     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'transformation')
-         196±2μs          186±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'std', 'direct')
-       192±0.4μs          182±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'std', 'transformation')
-       166±0.7μs          157±2μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'transformation')
-       198±0.5μs        188±0.8μs     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'direct')
-     4.24±0.02ms      4.02±0.02ms     0.95  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'int', 'min')
-         318±1μs        301±0.8μs     0.95  groupby.GroupByMethods.time_dtype_as_field('datetime', 'max', 'direct')
-         127±3μs          120±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'count', 'direct')
-         328±2μs          310±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('datetime', 'min', 'transformation')
-         228±1μs          215±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'direct')
-       239±0.8μs          226±1μs     0.95  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'transformation')
-         205±1μs        193±0.7μs     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'transformation')
-         314±2μs        297±0.9μs     0.94  groupby.GroupByMethods.time_dtype_as_field('datetime', 'last', 'transformation')
-         217±1μs        205±0.5μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'cummax', 'transformation')
-         842±3μs          796±5μs     0.94  groupby.Datelike.time_sum('date_range')
-         218±1μs        206±0.6μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'cummin', 'transformation')
-         218±2μs        206±0.6μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'cummin', 'direct')
-       226±0.4μs        213±0.4μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'transformation')
-         295±2μs          279±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'direct')
-         126±3μs          119±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct')
-         286±2μs          270±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cummin', 'direct')
-         227±2μs          215±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'transformation')
-       226±0.7μs        214±0.3μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'direct')
-         239±1μs        226±0.9μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'direct')
-         225±1μs          213±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'direct')
-      5.70±0.2ms      5.38±0.03ms     0.94  rolling.GroupbyEWM.time_groupby_method('cov')
-         295±1μs          278±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'direct')
-       162±0.5μs        153±0.9μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'transformation')
-         198±1μs          187±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'transformation')
-       241±0.9μs          227±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'transformation')
-       193±0.8μs        182±0.8μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'std', 'direct')
-         659±2μs          621±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('int', 'sem', 'direct')
-         168±1μs        158±0.6μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct')
-         198±1μs          186±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('int', 'std', 'transformation')
-         287±3μs          270±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cummin', 'transformation')
-       219±0.8μs        206±0.2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'direct')
-       167±0.5μs          158±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'transformation')
-         161±1μs          151±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'direct')
-     2.88±0.01ms      2.71±0.02ms     0.94  rolling.GroupbyEWMEngine.time_groupby_mean('cython')
-         131±2μs          123±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('int', 'size', 'transformation')
-         161±1μs          152±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'transformation')
-      41.2±0.7ms       38.7±0.6ms     0.94  groupby.Nth.time_series_nth_any('datetime')
-      40.8±0.3ms       38.3±0.5ms     0.94  groupby.Nth.time_series_nth_all('datetime')
-         315±1μs          296±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('datetime', 'last', 'direct')
-         131±1μs          123±2μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'size', 'transformation')
-       165±0.6μs        155±0.7μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'direct')
-       218±0.8μs        205±0.8μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'cummax', 'direct')
-         296±2μs          278±3μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'transformation')
-         292±3μs          274±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'transformation')
-       166±0.8μs        156±0.9μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'all', 'transformation')
-         660±4μs          619±3μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'sem', 'transformation')
-       168±0.9μs        158±0.5μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'direct')
-     24.0±0.07ms       22.5±0.2ms     0.94  groupby.AggFunctions.time_different_python_functions_multicol
-         131±2μs          123±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('object', 'size', 'direct')
-         135±1μs          127±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'size', 'transformation')
-        666±10μs          625±2μs     0.94  groupby.GroupByMethods.time_dtype_as_field('int', 'sem', 'transformation')
-         263±2μs          247±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'max', 'direct')
-         168±1μs        157±0.7μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'transformation')
-         295±1μs          276±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'direct')
-         297±4μs          278±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'transformation')
-         292±2μs        273±0.9μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'direct')
-         161±1μs          151±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'direct')
-         135±2μs          127±2μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'size', 'direct')
-         131±2μs          123±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('object', 'size', 'transformation')
-         132±2μs          124±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('datetime', 'size', 'direct')
-         813±3μs          761±2μs     0.94  groupby.Datelike.time_sum('date_range_tz')
-         131±2μs          123±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'size', 'direct')
-         129±3μs          120±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct')
-         296±3μs          277±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'transformation')
-         130±2μs        122±0.7μs     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'count', 'transformation')
-         132±2μs          123±1μs     0.93  groupby.GroupByMethods.time_dtype_as_field('int', 'size', 'direct')
-         132±2μs          123±1μs     0.93  groupby.GroupByMethods.time_dtype_as_group('object', 'size', 'direct')
-     4.38±0.01ms      4.09±0.04ms     0.93  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'sum')
-         134±2μs          125±2μs     0.93  groupby.GroupByMethods.time_dtype_as_group('int', 'size', 'transformation')
-     2.89±0.03ms      2.69±0.01ms     0.93  rolling.GroupbyEWM.time_groupby_method('var')
-         243±2μs          226±1μs     0.93  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'direct')
-         128±3μs          119±2μs     0.93  groupby.GroupByMethods.time_dtype_as_field('int', 'count', 'direct')
-     4.47±0.01ms      4.15±0.02ms     0.93  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'median')
-         132±2μs          122±2μs     0.93  groupby.GroupByMethods.time_dtype_as_group('object', 'size', 'transformation')
-     1.35±0.01ms      1.25±0.01ms     0.93  groupby.RankWithTies.time_rank_ties('float32', 'max')
-     4.40±0.03ms      4.09±0.03ms     0.93  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'min')
-     4.39±0.01ms      4.07±0.02ms     0.93  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'max')
-     1.35±0.01ms      1.26±0.01ms     0.93  groupby.RankWithTies.time_rank_ties('float32', 'dense')
-     4.42±0.01ms      4.09±0.02ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'mean')
-       167±0.5μs        155±0.6μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'transformation')
-     4.48±0.06ms      4.14±0.03ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'skew')
-     4.47±0.03ms      4.13±0.01ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'skew')
-         168±2μs          156±1μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct')
-     4.38±0.01ms      4.05±0.02ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'max')
-     1.34±0.01ms      1.23±0.01ms     0.92  groupby.RankWithTies.time_rank_ties('float64', 'dense')
-         114±1ms        106±0.2ms     0.92  groupby.GroupByMethods.time_dtype_as_field('datetime', 'unique', 'transformation')
-         115±1ms        106±0.3ms     0.92  groupby.GroupByMethods.time_dtype_as_field('datetime', 'unique', 'direct')
-       167±0.7μs        154±0.9μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'direct')
-     4.48±0.03ms      4.13±0.01ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'std')
-     4.41±0.01ms      4.06±0.03ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'sum')
-     4.48±0.02ms      4.13±0.02ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'median')
-         277±2ms          255±2ms     0.92  groupby.GroupByCythonAgg.time_frame_agg('float64', 'median')
-        1.34±0ms         1.23±0ms     0.92  groupby.RankWithTies.time_rank_ties('float64', 'max')
-     1.39±0.01ms      1.28±0.01ms     0.92  groupby.RankWithTies.time_rank_ties('int64', 'first')
-     4.38±0.03ms      4.02±0.01ms     0.92  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'min')
-        1.36±0ms         1.25±0ms     0.92  groupby.RankWithTies.time_rank_ties('float32', 'min')
-     1.36±0.01ms         1.24±0ms     0.92  groupby.RankWithTies.time_rank_ties('float32', 'first')
-       169±0.7μs          155±2μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'transformation')
-     1.34±0.01ms         1.23±0ms     0.92  groupby.RankWithTies.time_rank_ties('float64', 'average')
-     1.34±0.01ms      1.23±0.01ms     0.92  groupby.RankWithTies.time_rank_ties('float64', 'min')
-        1.38±0ms      1.26±0.01ms     0.92  groupby.RankWithTies.time_rank_ties('int64', 'min')
-     1.36±0.01ms         1.25±0ms     0.92  groupby.RankWithTies.time_rank_ties('float32', 'average')
-     1.39±0.01ms         1.27±0ms     0.92  groupby.RankWithTies.time_rank_ties('int64', 'dense')
-     1.38±0.01ms         1.26±0ms     0.92  groupby.RankWithTies.time_rank_ties('int64', 'average')
-      6.15±0.2ms      5.61±0.03ms     0.91  rolling.GroupbyEWM.time_groupby_method('corr')
-     1.39±0.02ms         1.26±0ms     0.91  groupby.RankWithTies.time_rank_ties('int64', 'max')
-     33.4±0.03ms      30.4±0.08ms     0.91  rolling.Pairwise.time_groupby(10, 'cov', False)
-         131±2μs          120±1μs     0.91  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'transformation')
-     4.73±0.01ms      4.29±0.01ms     0.91  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'count')
-         138±2μs          125±1μs     0.91  groupby.GroupByMethods.time_dtype_as_group('datetime', 'size', 'transformation')
-      33.5±0.2ms       30.4±0.1ms     0.91  rolling.Pairwise.time_groupby(1000, 'cov', False)
-     4.75±0.01ms      4.30±0.03ms     0.91  rolling.ExpandingMethods.time_expanding_groupby('DataFrame', 'float', 'count')
-      33.9±0.2ms      30.7±0.09ms     0.91  rolling.Pairwise.time_groupby(10, 'corr', False)
-      33.9±0.2ms       30.6±0.1ms     0.90  rolling.Pairwise.time_groupby(1000, 'corr', False)
-         534±2μs          482±2μs     0.90  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'direct')
-      31.7±0.3ms       28.6±0.1ms     0.90  rolling.Pairwise.time_groupby(None, 'cov', False)
-         535±3μs          483±2μs     0.90  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'transformation')
-         138±2μs          125±1μs     0.90  groupby.GroupByMethods.time_dtype_as_group('datetime', 'size', 'direct')
-      32.2±0.1ms      28.9±0.07ms     0.90  rolling.Pairwise.time_groupby(None, 'corr', False)
-      1.78±0.01s          1.60±0s     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'transformation')
-        1.12±0ms      1.01±0.01ms     0.90  groupby.SumMultiLevel.time_groupby_sum_multiindex
-      1.21±0.01s          1.09±0s     0.90  groupby.GroupByMethods.time_dtype_as_field('int', 'describe', 'direct')
-      2.78±0.01s       2.48±0.01s     0.89  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'transformation')
-      1.79±0.01s          1.60±0s     0.89  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct')
-     1.47±0.01ms      1.31±0.01ms     0.89  groupby.RankWithTies.time_rank_ties('datetime64', 'dense')
-         135±3μs          120±2μs     0.89  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct')
-      1.23±0.01s          1.10±0s     0.89  groupby.GroupByMethods.time_dtype_as_field('float', 'describe', 'direct')
-      1.21±0.01s          1.08±0s     0.89  groupby.GroupByMethods.time_dtype_as_field('int', 'describe', 'transformation')
-         461±3μs          411±1μs     0.89  groupby.GroupByMethods.time_dtype_as_field('datetime', 'ffill', 'transformation')
-      2.78±0.01s       2.48±0.01s     0.89  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct')
-     4.53±0.02ms      4.03±0.03ms     0.89  groupby.CountMultiDtype.time_multi_count
-         461±2μs          409±1μs     0.89  groupby.GroupByMethods.time_dtype_as_field('datetime', 'bfill', 'direct')
-      1.24±0.01s       1.10±0.01s     0.89  groupby.GroupByMethods.time_dtype_as_field('float', 'describe', 'transformation')
-     1.47±0.01ms      1.31±0.02ms     0.89  groupby.RankWithTies.time_rank_ties('datetime64', 'first')
-     1.47±0.01ms         1.30±0ms     0.89  groupby.RankWithTies.time_rank_ties('datetime64', 'average')
-     1.47±0.01ms      1.30±0.01ms     0.88  groupby.RankWithTies.time_rank_ties('datetime64', 'min')
-       462±0.8μs        409±0.9μs     0.88  groupby.GroupByMethods.time_dtype_as_field('datetime', 'bfill', 'transformation')
-       463±0.9μs        409±0.9μs     0.88  groupby.GroupByMethods.time_dtype_as_field('datetime', 'ffill', 'direct')
-     1.46±0.01ms      1.29±0.01ms     0.88  groupby.RankWithTies.time_rank_ties('datetime64', 'max')
-     1.90±0.01ms      1.62±0.03ms     0.86  groupby.TransformNaN.time_first
-         267±2μs          228±1μs     0.85  groupby.GroupByMethods.time_dtype_as_field('datetime', 'any', 'direct')
-         269±2μs          229±2μs     0.85  groupby.GroupByMethods.time_dtype_as_field('datetime', 'all', 'direct')
-         269±3μs        228±0.9μs     0.85  groupby.GroupByMethods.time_dtype_as_field('datetime', 'all', 'transformation')
-         267±2μs        227±0.9μs     0.85  groupby.GroupByMethods.time_dtype_as_field('datetime', 'any', 'transformation')
-     2.41±0.01ms      2.00±0.02ms     0.83  groupby.FillNA.time_df_ffill
-         418±3ms          346±2ms     0.83  groupby.GroupByMethods.time_dtype_as_field('int', 'mad', 'transformation')
-         418±3ms          346±3ms     0.83  groupby.GroupByMethods.time_dtype_as_field('int', 'mad', 'direct')
-         616±3ms          510±4ms     0.83  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'transformation')
-         962±2ms          797±7ms     0.83  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'transformation')
-         414±2ms          342±3ms     0.83  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'direct')
-     1.33±0.02ms         1.10±0ms     0.83  groupby.SumBools.time_groupby_sum_booleans
-         964±5ms          796±7ms     0.83  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'direct')
-         619±2ms          510±5ms     0.82  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'direct')
-         417±2ms          342±4ms     0.82  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'transformation')
-     2.43±0.01ms      1.99±0.01ms     0.82  groupby.FillNA.time_df_bfill
-       309±0.9μs        253±0.9μs     0.82  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'transformation')
-         310±1μs          253±1μs     0.81  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'direct')
-      96.1±0.8ms       77.7±0.8ms     0.81  groupby.TransformEngine.time_dataframe_cython(False)
-        96.6±1ms         77.4±1ms     0.80  groupby.TransformEngine.time_dataframe_cython(True)
-         579±2μs          460±5μs     0.80  groupby.GroupManyLabels.time_sum(1)
-       195±0.7μs          150±1μs     0.77  groupby.GroupByMethods.time_dtype_as_field('datetime', 'count', 'transformation')
-         195±2μs        150±0.4μs     0.77  groupby.GroupByMethods.time_dtype_as_field('datetime', 'count', 'direct')
-      6.89±0.9ms      4.86±0.06ms     0.70  groupby.Transform.time_transform_ufunc_max
-      66.6±0.3ms       46.8±0.2ms     0.70  groupby.Apply.time_copy_function_multi_col(5)
-         959±6μs          674±2μs     0.70  groupby.GroupByMethods.time_dtype_as_field('datetime', 'value_counts', 'transformation')
-         961±7μs          673±3μs     0.70  groupby.GroupByMethods.time_dtype_as_field('datetime', 'value_counts', 'direct')
-         546±5μs        326±0.5μs     0.60  groupby.GroupByMethods.time_dtype_as_field('datetime', 'nunique', 'transformation')
-         545±6μs          326±1μs     0.60  groupby.GroupByMethods.time_dtype_as_field('datetime', 'nunique', 'direct')
-       608±0.4ms        172±0.8ms     0.28  groupby.Apply.time_copy_overhead_single_col(4)
-      1.86±0.01s          455±2ms     0.24  groupby.Apply.time_copy_function_multi_col(4)

A few things are significantly slower:

  • The benchmarks that are affected by not using the "fast_apply" from libreduction (groupby.Apply.time_scalar_function_single_col(4) and groupby.Apply.time_scalar_function_multi_col(4)) are 2-3x slower. This would be fixed by [ArrayManager] Add libreduction frame Slider for ArrayManager #40171 (supporting ArrayManager in libreduction for dataframes), but so that's pending a decision on getting rid of libreduction alltogether or not.
  • The groupby.GroupManyLabels.time_sum(1000) case is 16x slower. This is a case of a small but wide dataframe (shape of 1000x1000), and it's per-column overhead of checking dtypes etc in BaseGrouper._cython_operation. PERF: reduce overhead in groupby _cython_operation #40317 already improves this a little bit, but there is certainly still room to further cut down this overhead by using more specialized dtype checks.

What's faster:

  • groupby.Apply.time_copy_overhead_single_col(4) is considerably faster (4x), but that might actually an (existing) bug in inconsistency between libreduction fast_apply and the fallback python apply. As with AM (taking the python fallback), it seems to infer it's doing a transform (same indexed result) and thus not reordering the result / not prepending the index with the groupby keys. Will open an issue about this -> BUG: groupby fast_apply vs python apply handles same-indexed result differently #40446
  • Some of the GroupByMethods benchmarks are slightly faster with ArrayManager, which from a quick look seems to stem from a smaller overhead in _get_numeric_data, but I think this overhead for BlockManager is also only visible because of the relatively small size of the data.

@jorisvandenbossche
Copy link
Member Author

Reductions (stat_ops)

$ asv continuous -f 1.01 -b stat_ops HEAD~1 HEAD
       before           after         ratio
     [c9628cbd]       [707df345]
     <am-benchmarks~1>       <am-benchmarks>
+     11.9±0.05ms          425±5ms    35.75  stat_ops.Correlation.time_corrwith_rows('pearson')
+     1.78±0.03ms       6.63±0.1ms     3.72  stat_ops.FrameOps.time_op('mean', 'float', 1)
+     1.76±0.03ms      6.41±0.06ms     3.64  stat_ops.FrameOps.time_op('sum', 'float', 1)
+      6.51±0.3ms       17.9±0.2ms     2.74  stat_ops.Correlation.time_corrwith_cols('pearson')
+      6.28±0.2ms       16.9±0.4ms     2.68  stat_ops.FrameOps.time_op('mad', 'float', 1)
+     3.35±0.06ms       6.07±0.3ms     1.81  stat_ops.FrameMultiIndexOps.time_op(0, 'var')
+     3.46±0.07ms      5.97±0.08ms     1.72  stat_ops.FrameMultiIndexOps.time_op(1, 'var')
+     3.09±0.05ms      5.23±0.09ms     1.69  stat_ops.FrameMultiIndexOps.time_op(0, 'sum')
+     3.12±0.07ms       5.18±0.1ms     1.66  stat_ops.FrameMultiIndexOps.time_op(0, 'mean')
+     3.16±0.04ms      5.12±0.04ms     1.62  stat_ops.FrameMultiIndexOps.time_op(1, 'sum')
+      3.19±0.1ms      5.13±0.09ms     1.61  stat_ops.FrameMultiIndexOps.time_op(1, 'mean')
+     1.82±0.03ms      2.89±0.02ms     1.59  stat_ops.FrameOps.time_op('sum', 'int', 1)
+     4.20±0.08ms       6.44±0.1ms     1.54  stat_ops.FrameOps.time_op('prod', 'float', 1)
+     2.06±0.04ms      3.16±0.02ms     1.53  stat_ops.FrameOps.time_op('prod', 'int', 1)
+         639±5ms          927±7ms     1.45  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'skew')
+      6.41±0.3ms       8.93±0.1ms     1.39  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'var')
+        75.5±1ms          104±2ms     1.37  stat_ops.FrameMultiIndexOps.time_op(1, 'skew')
+     3.17±0.07ms      4.30±0.05ms     1.36  stat_ops.FrameOps.time_op('mean', 'int', 1)
+      6.10±0.3ms      8.09±0.07ms     1.32  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'mean')
+      1.48±0.01s       1.92±0.02s     1.30  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'mad')
+     2.76±0.05ms      3.54±0.05ms     1.28  stat_ops.FrameMultiIndexOps.time_op(1, 'prod')
+     2.88±0.05ms      3.63±0.02ms     1.26  stat_ops.FrameMultiIndexOps.time_op(0, 'prod')
+         168±3ms          205±3ms     1.22  stat_ops.FrameMultiIndexOps.time_op(1, 'mad')
+      12.0±0.8ms       14.6±0.2ms     1.21  stat_ops.FrameOps.time_op('mad', 'int', 1)
+         519±6μs         613±10μs     1.18  stat_ops.Correlation.time_corr('pearson')
+     14.9±0.09ms       17.5±0.1ms     1.18  stat_ops.Correlation.time_corr_wide_nans('pearson')
+     1.57±0.02ms      1.79±0.02ms     1.15  stat_ops.FrameOps.time_op('mean', 'float', 0)
+      6.95±0.2ms      7.95±0.04ms     1.14  stat_ops.FrameOps.time_op('median', 'float', 0)
+     12.4±0.05ms      12.7±0.07ms     1.02  stat_ops.Rank.time_average_old('DataFrame', False)
-     6.57±0.04ms      6.23±0.06ms     0.95  stat_ops.FrameMultiIndexOps.time_op(0, 'std')
-     1.25±0.03ms      1.18±0.01ms     0.94  stat_ops.FrameOps.time_op('sum', 'Int64', 0)
-      6.72±0.3ms       6.23±0.1ms     0.93  stat_ops.FrameMultiIndexOps.time_op(1, 'std')
-        39.2±1ms       36.3±0.2ms     0.93  stat_ops.FrameOps.time_op('prod', 'Int64', 1)
-      13.4±0.5ms      12.3±0.05ms     0.92  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'sem')
-      41.8±0.7ms       38.3±0.7ms     0.92  stat_ops.FrameOps.time_op('mean', 'Int64', 1)
-      10.2±0.2ms      9.30±0.06ms     0.91  stat_ops.FrameMultiIndexOps.time_op(0, 'sem')
-        69.0±1ms         55.1±3ms     0.80  stat_ops.SeriesMultiIndexOps.time_op(1, 'mad')
-      2.39±0.2ms      1.86±0.04ms     0.78  stat_ops.FrameOps.time_op('prod', 'float', 0)
-         613±6ms          477±6ms     0.78  stat_ops.SeriesMultiIndexOps.time_op([0, 1], 'mad')
-      13.2±0.5ms       9.90±0.1ms     0.75  stat_ops.SeriesMultiIndexOps.time_op(0, 'mad')
-     1.56±0.03ms      1.15±0.01ms     0.74  stat_ops.FrameOps.time_op('sum', 'float', 0)
-        6.60±1ms      3.95±0.05ms     0.60  stat_ops.FrameOps.time_op('std', 'float', 0)
-        6.59±1ms      3.81±0.04ms     0.58  stat_ops.FrameOps.time_op('var', 'float', 0)
-      9.73±0.3ms      5.63±0.07ms     0.58  stat_ops.FrameOps.time_op('mad', 'int', 0)
-      9.11±0.7ms       4.85±0.4ms     0.53  stat_ops.FrameOps.time_op('skew', 'float', 0)
-      9.03±0.6ms      4.64±0.06ms     0.51  stat_ops.FrameOps.time_op('kurt', 'float', 0)
-     2.92±0.01ms      1.34±0.01ms     0.46  stat_ops.SeriesOps.time_op('mad', 'float')
-     2.19±0.02ms         962±40μs     0.44  stat_ops.FrameOps.time_op('sum', 'int', 0)
-     2.80±0.04ms      1.22±0.02ms     0.44  stat_ops.SeriesOps.time_op('mad', 'int')
-     2.42±0.02ms      1.05±0.01ms     0.43  stat_ops.FrameOps.time_op('prod', 'int', 0)
-      14.9±0.5ms      6.13±0.04ms     0.41  stat_ops.FrameOps.time_op('sem', 'int', 0)
-     5.90±0.02ms      2.36±0.04ms     0.40  stat_ops.FrameOps.time_op('std', 'int', 0)
-      5.96±0.1ms      2.28±0.02ms     0.38  stat_ops.FrameOps.time_op('var', 'int', 0)
-     2.84±0.02ms      1.06±0.01ms     0.37  stat_ops.FrameOps.time_op('mean', 'int', 0)
-      11.2±0.2ms       3.48±0.1ms     0.31  stat_ops.FrameOps.time_op('skew', 'int', 0)
-      11.1±0.1ms      3.11±0.07ms     0.28  stat_ops.FrameOps.time_op('kurt', 'int', 0)
  • DataFrame.corrwith(..., method="pearson", axis=1) is a lot slower:

    • for "pearson" we have custom code that operates on the datafame itself (a couple of arithmetic operations) -> those have currently a higher overhead with ArrayManager
    • this overhead is especially visible with axis=1, because then we transpose the dataframe, and get a (15, 500) shape

    But in general, this is a tiny but wide dataframe, so where the fixed overhead is significant. If I increase the size of the dataset, both have more or less the same performance.

  • Reductions with axis=1 (so taking eg the mean of each row, instead of each column) are slower, as can be expected (since this needs to go through a transpose / conversion to numpy array).

  • The FrameMultiIndexOps are 1.2-1.8x slower. This are basically groupby benchmarks, and thus showing that the built-in groupby aggregations are slightly slower when done column-wise (but so in the future we might be able to optimize this, if we can go all-in on 1D arrays in the cython code, xref [POC] PERF: 1d version of the cython grouped aggregation algorithms #39861)

  • The FrameOps with float dtypes are a bit faster with ArrayManager. From a quick look at the profiles, it seems that the handling of min_count is more efficient for 1D arrays (which have scalars as resut) as for 2D arrays (probably something that can be optimized).

  • The FrameOps with int dtypes are quite a bit faster with ArrayManager, but that seems to be caused by a suboptimal memory layout for the BlockManager case (so that being slower as it could be), so that might be an artefact of the setup code of the benchmark case.

@jorisvandenbossche
Copy link
Member Author

jorisvandenbossche commented Mar 15, 2021

Element-wise ops (arithmetic)

$ asv continuous -f 1.01 -b arithmetic HEAD~1 HEAD
       before           after         ratio
     [cc1802b8]       [42274f9e]
     <ops-refactor-combined~1>       <ops-refactor-combined>
+         450±4μs      5.59±0.08ms    12.42  arithmetic.Ops2.time_frame_series_dot
+     1.30±0.01ms      8.33±0.03ms     6.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function le>)
+     1.30±0.02ms      8.31±0.05ms     6.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function gt>)
+     1.31±0.01ms      8.34±0.04ms     6.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ne>)
+     1.31±0.01ms      8.35±0.03ms     6.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ge>)
+     1.31±0.01ms      8.33±0.05ms     6.36  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function lt>)
+     1.39±0.01ms      8.84±0.06ms     6.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ge>)
+     1.40±0.01ms      8.84±0.08ms     6.32  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function le>)
+     1.32±0.01ms      8.30±0.07ms     6.31  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function eq>)
+     45.1±0.06ms          277±1ms     6.14  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000, 10000))
+     1.48±0.01ms      8.99±0.04ms     6.07  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function eq>)
+        1.48±0ms      8.91±0.08ms     6.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function gt>)
+     1.39±0.01ms      8.37±0.06ms     6.03  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function le>)
+     1.48±0.01ms      8.93±0.05ms     6.02  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function lt>)
+        1.40±0ms      8.31±0.06ms     5.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ge>)
+     1.47±0.01ms      8.52±0.05ms     5.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function lt>)
+     1.47±0.01ms      8.50±0.03ms     5.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function eq>)
+     1.47±0.01ms      8.45±0.07ms     5.74  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function gt>)
+     1.61±0.01ms      9.13±0.05ms     5.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ne>)
+     6.14±0.03ms       33.8±0.3ms     5.50  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000, 10000))
+     1.73±0.02ms      9.27±0.08ms     5.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ne>)
+     1.61±0.01ms      8.60±0.06ms     5.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ne>)
+     1.74±0.02ms      9.26±0.06ms     5.33  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function gt>)
+     1.73±0.01ms      9.21±0.05ms     5.32  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function le>)
+     1.74±0.02ms      9.24±0.02ms     5.31  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function lt>)
+     1.74±0.03ms      9.22±0.08ms     5.29  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ge>)
+     1.74±0.02ms      9.18±0.05ms     5.29  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function eq>)
+     1.81±0.02ms      9.36±0.06ms     5.18  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function le>)
+     1.81±0.01ms      9.35±0.04ms     5.17  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ge>)
+     1.75±0.01ms      8.87±0.06ms     5.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ge>)
+     1.84±0.02ms      9.31±0.05ms     5.07  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ge>)
+     1.85±0.01ms      9.36±0.05ms     5.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function le>)
+     1.75±0.01ms      8.85±0.02ms     5.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function le>)
+     1.91±0.01ms      9.49±0.06ms     4.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function eq>)
+     1.79±0.02ms      8.91±0.03ms     4.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ge>)
+     1.91±0.01ms      9.48±0.04ms     4.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function lt>)
+     1.79±0.02ms      8.87±0.06ms     4.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function le>)
+     1.92±0.02ms      9.45±0.05ms     4.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function gt>)
+     18.2±0.04ms       88.8±0.3ms     4.88  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (1000, 10000))
+     1.93±0.02ms      9.43±0.07ms     4.88  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function lt>)
+     1.94±0.01ms      9.42±0.07ms     4.86  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function gt>)
+     10.1±0.04ms       49.3±0.7ms     4.86  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000, 10000))
+     1.95±0.01ms      9.46±0.03ms     4.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function eq>)
+     1.86±0.01ms      8.94±0.03ms     4.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function gt>)
+     1.87±0.02ms      8.92±0.04ms     4.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function lt>)
+     1.89±0.02ms      9.00±0.05ms     4.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function lt>)
+     1.88±0.01ms      8.95±0.03ms     4.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function eq>)
+     2.02±0.02ms      9.58±0.05ms     4.75  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ne>)
+     1.91±0.01ms      9.01±0.05ms     4.73  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function eq>)
+     1.91±0.01ms      8.95±0.04ms     4.69  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function gt>)
+     2.06±0.01ms      9.61±0.04ms     4.66  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ne>)
+     2.01±0.01ms      9.26±0.05ms     4.60  arithmetic.Ops.time_frame_comparison(True, 'default')
+     2.00±0.02ms      9.05±0.04ms     4.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ne>)
+     2.04±0.02ms      9.13±0.02ms     4.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ne>)
+        8.83±5ms       36.3±0.1ms     4.11  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000, 10000))
+     2.41±0.02ms      9.89±0.04ms     4.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function truediv>)
+     2.36±0.01ms      9.65±0.04ms     4.09  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function sub>)
+     2.37±0.02ms      9.67±0.06ms     4.09  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function add>)
+     2.35±0.01ms      9.59±0.05ms     4.09  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function add>)
+     2.43±0.01ms      9.93±0.08ms     4.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function truediv>)
+     2.35±0.01ms      9.58±0.09ms     4.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mul>)
+     2.36±0.01ms      9.60±0.05ms     4.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function sub>)
+     2.37±0.01ms      9.62±0.07ms     4.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mul>)
+     2.43±0.01ms      9.72±0.06ms     4.00  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function add>)
+     2.44±0.01ms      9.71±0.05ms     3.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mul>)
+     2.38±0.01ms      9.45±0.05ms     3.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mul>)
+     2.44±0.01ms      9.71±0.03ms     3.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function sub>)
+     2.38±0.01ms      9.43±0.05ms     3.96  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function sub>)
+     2.39±0.01ms      9.44±0.06ms     3.96  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function add>)
+     2.38±0.01ms      9.42±0.02ms     3.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function truediv>)
+     2.37±0.01ms      9.07±0.05ms     3.82  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mul>)
+     2.39±0.01ms       9.12±0.1ms     3.82  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function add>)
+     2.36±0.01ms      9.01±0.09ms     3.82  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function sub>)
+     2.36±0.02ms      9.02±0.06ms     3.82  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function add>)
+     2.42±0.02ms      9.22±0.04ms     3.82  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mul>)
+     2.38±0.02ms       9.07±0.1ms     3.81  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function sub>)
+     2.42±0.02ms      9.21±0.04ms     3.80  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function add>)
+     2.54±0.02ms      9.66±0.08ms     3.80  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function truediv>)
+        13.7±1ms       52.2±0.3ms     3.80  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (1000, 10000))
+     2.37±0.01ms      9.00±0.04ms     3.80  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mul>)
+     2.38±0.01ms      9.01±0.05ms     3.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function add>)
+     2.37±0.02ms      8.97±0.06ms     3.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function sub>)
+     2.37±0.01ms      8.99±0.06ms     3.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mul>)
+     2.82±0.08ms      10.6±0.09ms     3.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function truediv>)
+     2.43±0.01ms      9.14±0.07ms     3.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function sub>)
+     2.89±0.08ms      10.8±0.06ms     3.75  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function truediv>)
+     2.77±0.06ms      9.90±0.06ms     3.57  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function truediv>)
+      3.18±0.1ms       10.7±0.2ms     3.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function truediv>)
+     3.20±0.02ms      10.1±0.05ms     3.16  arithmetic.Ops.time_frame_add(True, 'default')
+     3.21±0.02ms      10.1±0.06ms     3.15  arithmetic.Ops.time_frame_mult(True, 'default')
+     2.10±0.04ms      6.27±0.03ms     2.98  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('truediv')
+     1.37±0.02ms      3.49±0.02ms     2.55  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('lt')
+     1.36±0.02ms      3.45±0.07ms     2.53  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('gt')
+     1.38±0.01ms      3.48±0.03ms     2.52  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('le')
+     1.37±0.02ms      3.42±0.06ms     2.49  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('eq')
+     1.37±0.01ms      3.42±0.03ms     2.49  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ne')
+     1.65±0.02ms      4.06±0.07ms     2.47  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('mul')
+     1.38±0.01ms      3.41±0.03ms     2.47  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ge')
+     1.63±0.01ms      3.93±0.09ms     2.42  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('sub')
+     1.64±0.06ms      3.92±0.05ms     2.39  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('add')
+      32.9±0.2ms       78.1±0.4ms     2.37  arithmetic.Ops.time_frame_multi_and(True, 'default')
+     6.08±0.07ms       13.5±0.1ms     2.21  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (100000, 100))
+     2.99±0.08ms      5.99±0.04ms     2.00  arithmetic.Ops.time_frame_comparison(True, 1)
+     3.29±0.01ms      6.19±0.06ms     1.88  arithmetic.Ops.time_frame_add(True, 1)
+     3.30±0.07ms      6.18±0.04ms     1.88  arithmetic.Ops.time_frame_mult(True, 1)
+     10.0±0.03ms      18.5±0.09ms     1.85  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (10000, 1000))
+      48.0±0.6ms       83.2±0.2ms     1.74  arithmetic.Ops2.time_frame_float_floor_by_zero
+      4.62±0.2ms       8.00±0.1ms     1.73  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('lt')
+     4.57±0.04ms       7.88±0.1ms     1.73  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('le')
+     4.67±0.03ms      7.93±0.04ms     1.70  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('gt')
+      4.62±0.3ms      7.83±0.05ms     1.70  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ge')
+      4.69±0.2ms      7.91±0.07ms     1.69  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('eq')
+     10.1±0.05ms      17.1±0.07ms     1.69  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (100000, 100))
+     4.75±0.04ms      7.82±0.03ms     1.65  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ne')
+      39.3±0.8ms       64.4±0.3ms     1.64  arithmetic.Ops.time_frame_multi_and(True, 1)
+      27.5±0.4ms       43.2±0.4ms     1.57  arithmetic.Ops2.time_frame_dot
+     20.7±0.03ms       31.9±0.2ms     1.54  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function pow>)
+     20.7±0.03ms       31.1±0.2ms     1.50  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function pow>)
+     45.1±0.09ms       64.1±0.2ms     1.42  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (10000, 1000))
+     6.06±0.04ms      8.56±0.04ms     1.41  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (10000, 1000))
+      37.4±0.4ms       51.8±0.2ms     1.39  arithmetic.Ops.time_frame_multi_and(False, 1)
+      37.3±0.3ms       51.5±0.2ms     1.38  arithmetic.Ops.time_frame_multi_and(False, 'default')
+      41.5±0.3ms       56.9±0.6ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function pow>)
+     41.3±0.07ms       56.1±0.2ms     1.36  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function pow>)
+     41.3±0.08ms       55.9±0.3ms     1.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function pow>)
+     41.9±0.09ms       56.4±0.4ms     1.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function pow>)
+     2.02±0.05ms      2.38±0.01ms     1.18  arithmetic.Ops.time_frame_comparison(False, 'default')
+     2.07±0.08ms      2.39±0.01ms     1.16  arithmetic.Ops.time_frame_comparison(False, 1)
+      52.5±0.4ms       60.4±0.2ms     1.15  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('floordiv')
+      32.0±0.3ms      36.5±0.04ms     1.14  arithmetic.Ops2.time_frame_float_mod
+      18.1±0.1ms      20.0±0.05ms     1.10  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (10000, 1000))
+     6.02±0.06ms      6.49±0.07ms     1.08  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000000, 10))
+     33.1±0.09ms      34.8±0.04ms     1.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mod>)
+     32.4±0.06ms       33.9±0.1ms     1.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mod>)
+     27.3±0.05ms      28.5±0.08ms     1.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mod>)
+      27.2±0.1ms      28.4±0.03ms     1.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mod>)
+      27.0±0.1ms      27.8±0.05ms     1.03  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mod>)
+     29.2±0.09ms       30.0±0.1ms     1.03  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mod>)
+     27.2±0.03ms      27.9±0.09ms     1.03  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mod>)
+     44.6±0.05ms       45.3±0.1ms     1.02  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000000, 10))
-         1.40±0s          1.37±0s     0.98  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<CustomBusinessMonthBegin>)
-     1.77±0.01ms         1.73±0ms     0.98  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<BusinessMonthEnd>)
-        1.43±0ms         1.40±0ms     0.98  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<BusinessQuarterBegin: startingMonth=3>)
-        1.58±0ms         1.54±0ms     0.98  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<BYearEnd: month=12>)
-        1.38±0ms         1.34±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<SemiMonthBegin: day_of_month=15>)
-     1.02±0.01ms          987±5μs     0.97  arithmetic.NumericInferOps.time_divide(<class 'numpy.uint16'>)
-        1.54±0ms         1.50±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<BusinessQuarterEnd: startingMonth=3>)
-        1.47±0ms         1.43±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<MonthEnd>)
-     1.46±0.01ms         1.42±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<BusinessMonthBegin>)
-        1.41±0ms      1.37±0.01ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<QuarterEnd: startingMonth=3>)
-     4.30±0.02ms      4.17±0.02ms     0.97  arithmetic.DateInferOps.time_timedelta_plus_datetime
-        1.31±0ms         1.27±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<YearBegin: month=1>)
-     1.34±0.01ms         1.30±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<QuarterBegin: startingMonth=3>)
-        1.46±0ms         1.41±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<YearEnd: month=12>)
-         938±6ms          908±8ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<CustomBusinessMonthEnd>)
-     1.38±0.01ms         1.33±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<DateOffset: days=2, months=2>)
-        1.27±0ms         1.23±0ms     0.96  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<MonthBegin>)
-        478±10μs          458±2μs     0.96  arithmetic.NumericInferOps.time_multiply(<class 'numpy.uint32'>)
-         186±2μs          176±2μs     0.94  arithmetic.NumericInferOps.time_subtract(<class 'numpy.int8'>)
-        480±10μs          453±3μs     0.94  arithmetic.NumericInferOps.time_add(<class 'numpy.uint32'>)
-         290±2μs          271±2μs     0.93  arithmetic.NumericInferOps.time_add(<class 'numpy.int16'>)
-      52.7±0.1ms      49.1±0.09ms     0.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function floordiv>)
-         295±3μs          274±2μs     0.93  arithmetic.NumericInferOps.time_add(<class 'numpy.uint16'>)
-         186±2μs          173±3μs     0.93  arithmetic.NumericInferOps.time_subtract(<class 'numpy.uint8'>)
-      53.3±0.2ms       49.2±0.1ms     0.92  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function floordiv>)
-      57.8±0.2ms       52.9±0.2ms     0.92  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function floordiv>)
-      52.9±0.2ms       48.4±0.2ms     0.92  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function floordiv>)
-      55.4±0.4ms       50.6±0.3ms     0.91  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function floordiv>)
-      55.9±0.4ms       50.8±0.1ms     0.91  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function floordiv>)
-      55.6±0.2ms      50.3±0.08ms     0.90  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function floordiv>)
-      52.4±0.2ms      47.2±0.08ms     0.90  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function floordiv>)
-      30.6±0.2ms       27.3±0.2ms     0.89  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function pow>)
-        78.5±1ms         69.7±4ms     0.89  arithmetic.BinaryOpsMultiIndex.time_binary_op_multiindex('div')
-     45.1±0.04ms       40.0±0.1ms     0.89  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (100000, 100))
-       106±0.6ms       89.9±0.1ms     0.84  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('pow')
-      59.1±0.4ms       46.3±0.4ms     0.78  arithmetic.Ops2.time_frame_float_div
-         252±1μs        194±0.6μs     0.77  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<Day>)
-      21.8±0.4ms       16.5±0.2ms     0.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function pow>)
-     18.1±0.08ms      12.5±0.04ms     0.69  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (100000, 100))
-      57.9±0.4ms       29.4±0.3ms     0.51  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('floordiv')
-        79.6±1ms       29.8±0.2ms     0.37  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('pow')
-      55.9±0.1ms      5.97±0.03ms     0.11  arithmetic.Ops2.time_frame_int_div_by_zero
-      55.9±0.3ms      4.85±0.02ms     0.09  arithmetic.Ops2.time_frame_float_div_by_zero

The above is with a branch that combines several WIP changes (https://github.com/pandas-dev/pandas/compare/master...jorisvandenbossche:ops-refactor-combined?expand=1, for some there is already an open PR, eg #40445, #40444, #40396, #39772, for others I still need to open a PR but are dependent on other changes).

In general the element-wise ops are probably that set of operations that can see the biggest impact of performing column-by-column instead of on a single block.
A few first notes:

  • dot() is slower, but since that's basically a 2D array operation, that's to be expected.
  • It seems that specifically the comparison ops are slower column-wise when using numexpr (eg many of the IntFrameWithScalar.time_frame_op_with_scalar benchmarks in the output above with lt/gt/eq/ne/... ops). That's something I need to investigate a bit more in detail, because this slowdown doesn't seem to come from per-column overhead, but actually numexpr being slower.
  • The majority of the FrameWithFrameWide benchmarks actually don't show up in the above output (so meaning that they didn't give a significant difference), and the ones that do show up with the biggest slowdown are the cases with shape (1000, 10000), so wide dataframes. For wide dataframes, some slowdown will be inevitable (question is of course how much we find acceptable).

UPDATE 2021-04-01:
Using latest master + #40482

$ asv continuous -f 1.01 -b arithmetic HEAD~1 HEAD
       before           after         ratio
     [fd958262]       [89c230c8]
     <am-benchmarks~1>       <am-benchmarks>
+     6.59±0.08ms       98.1±0.9ms    14.88  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000, 10000))
+      10.7±0.1ms          128±9ms    11.96  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000, 10000))
+         472±3μs       5.63±0.6ms    11.92  arithmetic.Ops2.time_frame_series_dot
+      14.8±0.4ms          148±3ms     9.99  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (1000, 10000))
+     45.5±0.06ms          384±6ms     8.44  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000, 10000))
+     1.25±0.01ms         10.5±1ms     8.41  arithmetic.Ops2.time_frame_float_div_by_zero
+     13.7±0.03ms         99.9±2ms     7.27  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (1000, 10000))
+     1.93±0.02ms       12.3±0.8ms     6.41  arithmetic.Ops2.time_frame_int_div_by_zero
+     1.76±0.06ms       11.0±0.2ms     6.25  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('eq')
+     1.78±0.05ms       11.1±0.1ms     6.21  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('gt')
+     1.77±0.06ms      10.9±0.03ms     6.18  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ne')
+     1.80±0.06ms       11.0±0.1ms     6.12  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('lt')
+     1.80±0.06ms      11.0±0.04ms     6.11  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ge')
+     1.80±0.07ms      10.9±0.05ms     6.06  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('le')
+     24.8±0.03ms        114±0.2ms     4.61  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('pow')
+     2.04±0.02ms      9.31±0.09ms     4.57  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('sub')
+     2.06±0.03ms      9.38±0.03ms     4.56  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('add')
+     2.26±0.04ms      9.51±0.04ms     4.21  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('mul')
+     3.15±0.01ms      12.8±0.08ms     4.06  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('truediv')
+        21.9±7ms         82.7±2ms     3.78  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000, 10000))
+        23.4±3ms         66.4±7ms     2.84  arithmetic.Ops.time_frame_multi_and(True, 'default')
+     10.7±0.09ms         29.7±2ms     2.77  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (10000, 1000))
+      44.6±0.3ms          116±9ms     2.59  arithmetic.Ops2.time_frame_float_floor_by_zero
+     6.49±0.06ms      16.0±0.09ms     2.46  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (10000, 1000))
+     13.7±0.07ms         31.1±2ms     2.27  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (10000, 1000))
+        29.6±3ms         66.7±7ms     2.25  arithmetic.Ops.time_frame_multi_and(False, 1)
+        29.9±3ms         65.8±6ms     2.20  arithmetic.Ops.time_frame_multi_and(False, 'default')
+     1.98±0.03ms      4.24±0.03ms     2.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ge>)
+     1.99±0.02ms      4.24±0.03ms     2.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function le>)
+     1.97±0.03ms      4.10±0.03ms     2.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ge>)
+     1.98±0.04ms      4.08±0.02ms     2.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function le>)
+        32.5±3ms         66.3±6ms     2.04  arithmetic.Ops.time_frame_multi_and(True, 1)
+     2.09±0.03ms      4.23±0.03ms     2.02  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function lt>)
+     2.36±0.01ms      4.76±0.03ms     2.01  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mul>)
+     1.40±0.01ms      2.81±0.02ms     2.01  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function lt>)
+     1.41±0.01ms      2.83±0.02ms     2.01  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ge>)
+     1.40±0.02ms      2.80±0.01ms     2.01  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function le>)
+     1.41±0.01ms      2.82±0.02ms     2.01  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function le>)
+     2.38±0.01ms      4.77±0.02ms     2.00  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function add>)
+     2.13±0.03ms      4.24±0.03ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function gt>)
+     2.12±0.01ms      4.23±0.02ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function eq>)
+     2.38±0.01ms      4.72±0.02ms     1.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function sub>)
+     1.42±0.01ms      2.81±0.02ms     1.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function gt>)
+     1.43±0.01ms      2.81±0.02ms     1.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ge>)
+     2.36±0.02ms      4.66±0.02ms     1.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mul>)
+     2.38±0.01ms      4.65±0.03ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function add>)
+     2.11±0.01ms      4.10±0.03ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function gt>)
+     1.40±0.01ms      2.72±0.01ms     1.94  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ge>)
+     2.10±0.03ms      4.08±0.02ms     1.94  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function eq>)
+     1.40±0.02ms      2.70±0.01ms     1.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ne>)
+     2.11±0.02ms      4.08±0.02ms     1.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function lt>)
+     1.40±0.02ms      2.71±0.01ms     1.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function le>)
+     2.39±0.02ms      4.61±0.03ms     1.93  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function sub>)
+     1.41±0.01ms      2.70±0.03ms     1.92  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function eq>)
+     1.51±0.02ms      2.82±0.02ms     1.86  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function eq>)
+     2.28±0.03ms      4.22±0.03ms     1.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ne>)
+     1.55±0.01ms      2.84±0.01ms     1.83  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function gt>)
+     1.54±0.01ms      2.82±0.02ms     1.83  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function lt>)
+     45.4±0.04ms       83.1±0.5ms     1.83  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (10000, 1000))
+      15.5±0.7ms       28.2±0.2ms     1.82  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (10000, 1000))
+     2.26±0.03ms      4.08±0.03ms     1.81  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ne>)
+     3.03±0.02ms      5.43±0.03ms     1.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function truediv>)
+     1.52±0.03ms      2.71±0.01ms     1.78  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function lt>)
+     1.54±0.01ms      2.73±0.02ms     1.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function gt>)
+     1.53±0.02ms      2.70±0.01ms     1.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function eq>)
+     3.01±0.03ms      5.31±0.01ms     1.76  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function truediv>)
+      46.5±0.9ms       80.1±0.5ms     1.72  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('floordiv')
+     24.0±0.06ms       41.1±0.2ms     1.71  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function pow>)
+      24.1±0.1ms       41.0±0.2ms     1.70  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function pow>)
+     3.25±0.08ms      5.48±0.02ms     1.69  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function truediv>)
+     2.01±0.04ms      3.39±0.02ms     1.68  arithmetic.Ops.time_frame_comparison(True, 'default')
+      31.7±0.2ms         53.3±4ms     1.68  arithmetic.Ops2.time_frame_dot
+      10.6±0.8ms       17.9±0.1ms     1.68  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('eq')
+      10.6±0.8ms       17.8±0.3ms     1.68  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('gt')
+      10.6±0.7ms       17.7±0.1ms     1.66  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ge')
+      10.7±0.8ms       17.8±0.2ms     1.66  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ne')
+      10.7±0.8ms      17.7±0.09ms     1.66  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('lt')
+      10.7±0.9ms       17.6±0.3ms     1.65  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('le')
+     1.73±0.01ms      2.84±0.01ms     1.64  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ne>)
+     1.87±0.01ms      2.98±0.02ms     1.60  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function lt>)
+     1.88±0.02ms      2.99±0.02ms     1.59  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function le>)
+     1.88±0.01ms      2.97±0.02ms     1.58  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ge>)
+     1.89±0.02ms      2.99±0.01ms     1.58  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function gt>)
+     1.74±0.01ms      2.72±0.01ms     1.56  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ne>)
+     10.6±0.07ms       16.4±0.1ms     1.54  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (100000, 100))
+     1.89±0.03ms      2.89±0.03ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ne>)
+     1.89±0.03ms      2.86±0.03ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function eq>)
+     2.39±0.01ms      3.60±0.02ms     1.51  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mul>)
+     2.19±0.03ms      3.31±0.02ms     1.51  arithmetic.Ops.time_frame_comparison(False, 'default')
+     2.21±0.05ms      3.30±0.01ms     1.49  arithmetic.Ops.time_frame_comparison(False, 1)
+     3.61±0.07ms      5.37±0.02ms     1.48  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function truediv>)
+     2.45±0.02ms      3.60±0.03ms     1.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function truediv>)
+     1.98±0.03ms      2.89±0.02ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function le>)
+     2.35±0.01ms      3.42±0.03ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mul>)
+     2.44±0.02ms      3.55±0.03ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function truediv>)
+     1.94±0.01ms      2.79±0.02ms     1.44  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function le>)
+     1.95±0.03ms      2.79±0.02ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ge>)
+     2.02±0.02ms      2.89±0.03ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ge>)
+     2.40±0.01ms      3.43±0.01ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mul>)
+     2.40±0.01ms      3.42±0.02ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function add>)
+     2.39±0.01ms      3.40±0.03ms     1.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function sub>)
+     2.39±0.01ms      3.41±0.03ms     1.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function add>)
+     2.36±0.01ms      3.36±0.02ms     1.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function add>)
+     2.40±0.01ms      3.40±0.02ms     1.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function sub>)
+     2.42±0.02ms      3.44±0.02ms     1.42  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function truediv>)
+     3.00±0.03ms       4.25±0.4ms     1.42  arithmetic.Ops.time_frame_mult(False, 'default')
+     2.37±0.01ms      3.35±0.02ms     1.41  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function sub>)
+     2.39±0.01ms      3.37±0.02ms     1.41  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mul>)
+      10.6±0.1ms      14.9±0.08ms     1.41  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000000, 10))
+     2.37±0.02ms      3.34±0.05ms     1.41  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function add>)
+     2.37±0.02ms      3.33±0.01ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mul>)
+     45.4±0.06ms         63.7±4ms     1.40  arithmetic.Ops2.time_frame_float_div
+     2.38±0.02ms      3.31±0.02ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function sub>)
+     2.36±0.03ms      3.28±0.02ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mul>)
+     2.11±0.01ms      2.92±0.03ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function gt>)
+     2.36±0.01ms      3.26±0.02ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function sub>)
+     2.09±0.02ms      2.88±0.02ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function eq>)
+     2.36±0.01ms      3.25±0.03ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function add>)
+     2.38±0.01ms      3.28±0.02ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function add>)
+     2.03±0.03ms      2.80±0.03ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function gt>)
+     2.02±0.02ms      2.79±0.02ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function lt>)
+        11.1±1ms       15.2±0.1ms     1.38  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('truediv')
+        10.9±1ms       14.9±0.2ms     1.37  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('mul')
+     2.37±0.02ms      3.23±0.03ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function sub>)
+     3.02±0.04ms       4.12±0.3ms     1.37  arithmetic.Ops.time_frame_mult(False, 1)
+        10.9±1ms       14.8±0.2ms     1.36  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('add')
+     2.13±0.03ms      2.89±0.02ms     1.36  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function lt>)
+        10.9±1ms       14.8±0.3ms     1.35  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('sub')
+     2.06±0.02ms      2.77±0.02ms     1.35  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function eq>)
+     48.4±0.06ms      65.0±0.05ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function pow>)
+     48.4±0.05ms      65.1±0.03ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function pow>)
+     48.4±0.09ms      64.9±0.05ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function pow>)
+     2.20±0.02ms      2.89±0.02ms     1.31  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ne>)
+     2.72±0.04ms      3.52±0.02ms     1.29  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function truediv>)
+     3.05±0.06ms      3.94±0.01ms     1.29  arithmetic.Ops.time_frame_add(False, 1)
+      38.9±0.1ms         49.9±3ms     1.28  arithmetic.Ops2.time_frame_float_mod
+     2.19±0.02ms      2.79±0.02ms     1.27  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ne>)
+      34.2±0.2ms         42.4±3ms     1.24  arithmetic.Ops2.time_frame_int_mod
+      35.6±0.8ms       41.4±0.3ms     1.16  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('pow')
+     45.4±0.02ms       49.4±0.4ms     1.09  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (100000, 100))
+     40.1±0.02ms      42.7±0.07ms     1.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mod>)
+     32.9±0.03ms      34.8±0.04ms     1.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mod>)
+     39.2±0.01ms       41.5±0.1ms     1.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mod>)
+     32.8±0.05ms      34.5±0.04ms     1.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mod>)
+     32.6±0.03ms      34.2±0.03ms     1.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mod>)
+     32.6±0.02ms      34.1±0.04ms     1.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mod>)
+     32.8±0.01ms      34.2±0.03ms     1.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mod>)
+        39.9±1ms       41.3±0.4ms     1.03  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('floordiv')
-     3.08±0.01ms         3.03±0ms     0.99  arithmetic.IndexArithmetic.time_divide('int')
-     2.31±0.01ms      2.27±0.01ms     0.98  arithmetic.IndexArithmetic.time_subtract('int')
-     2.32±0.01ms      2.26±0.01ms     0.98  arithmetic.IndexArithmetic.time_add('int')
-     1.17±0.01ms         1.14±0ms     0.98  arithmetic.NumericInferOps.time_divide(<class 'numpy.int16'>)
-      1.63±0.1ms         1.57±0ms     0.97  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<QuarterBegin: startingMonth=3>)
-         308±2μs          294±2μs     0.95  arithmetic.NumericInferOps.time_add(<class 'numpy.int16'>)
-      14.9±0.6ms      14.2±0.01ms     0.95  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (1000000, 10))
-         308±2μs          292±1μs     0.95  arithmetic.NumericInferOps.time_multiply(<class 'numpy.uint16'>)
-         310±2μs          294±3μs     0.95  arithmetic.NumericInferOps.time_subtract(<class 'numpy.int16'>)
-        510±20μs          483±2μs     0.95  arithmetic.NumericInferOps.time_divide(<class 'numpy.float32'>)
-        510±10μs          484±3μs     0.95  arithmetic.NumericInferOps.time_add(<class 'numpy.uint32'>)
-        509±10μs          483±3μs     0.95  arithmetic.NumericInferOps.time_add(<class 'numpy.float32'>)
-         308±3μs          292±3μs     0.95  arithmetic.NumericInferOps.time_subtract(<class 'numpy.uint16'>)
-     4.15±0.07ms      3.92±0.01ms     0.95  arithmetic.NumericInferOps.time_modulo(<class 'numpy.uint16'>)
-         199±2μs          188±1μs     0.95  arithmetic.NumericInferOps.time_subtract(<class 'numpy.uint8'>)
-         203±2μs          191±1μs     0.94  arithmetic.NumericInferOps.time_add(<class 'numpy.int8'>)
-         251±1μs        236±0.9μs     0.94  arithmetic.OffsetArrayArithmetic.time_add_series_offset(<Day>)
-      1.27±0.1ms         1.19±0ms     0.94  arithmetic.NumericInferOps.time_divide(<class 'numpy.int32'>)
-         213±2μs          199±1μs     0.93  arithmetic.NumericInferOps.time_multiply(<class 'numpy.int8'>)
-         202±3μs        188±0.6μs     0.93  arithmetic.NumericInferOps.time_subtract(<class 'numpy.int8'>)
-        513±20μs          474±2μs     0.92  arithmetic.NumericInferOps.time_subtract(<class 'numpy.uint32'>)
-        529±20μs          487±2μs     0.92  arithmetic.NumericInferOps.time_multiply(<class 'numpy.uint32'>)
-        523±20μs          477±4μs     0.91  arithmetic.NumericInferOps.time_subtract(<class 'numpy.int32'>)
-      6.97±0.4ms      5.82±0.03ms     0.84  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000000, 10))
-      68.3±0.1ms       46.8±0.1ms     0.69  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function floordiv>)
-      62.7±0.1ms      42.6±0.02ms     0.68  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function floordiv>)
-      65.4±0.2ms      44.1±0.07ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function floordiv>)
-      65.6±0.2ms       44.2±0.1ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function floordiv>)
-      65.3±0.2ms      44.0±0.07ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function floordiv>)
-      61.7±0.1ms       41.3±0.1ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function floordiv>)
-     62.1±0.07ms      41.5±0.03ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function floordiv>)
-     62.1±0.04ms      41.4±0.04ms     0.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function floordiv>)
-      35.3±0.1ms      14.1±0.03ms     0.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function pow>)
-      24.4±0.1ms      3.35±0.02ms     0.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function pow>)
-     48.8±0.05ms      3.27±0.02ms     0.07  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function pow>)

Two notes about a few benchmarks that are (unexpectedly) a lot faster with ArrayManager:

  • The IntFrameWithScalar benchmark is more than 10x faster for the pow operations for certain cases. I could reproduce this outside of ASV, and turns out this is due to numexpr being slower, and because of the size of the dataframe, the column-wise op (ArrayManager) doesn't use numexpr, while block-wise (BlockManager) uses numexpr. In an environment without numexpr, both were more or less the same.
  • The IntFrameWithScalar benchmark with the floordiv operation is faster with ArrayManager. This turns out because when using numexpr, we incorrectly end up falling back using _masked_arith_op (which is slower), because the operation is not supported by numexpr.

@jorisvandenbossche
Copy link
Member Author

jorisvandenbossche commented Dec 7, 2021

Over the last weeks I have been updating the status of this project (and fixing some regressions), and rerunning the benchmarks. This (long) post gives an overview of the current ASV benchmarks with the ArrayManager.

Technical notes: I always ran the benchmark on a commit where I changed the default to ArrayManager (HEAD) vs the previous commit with the normal default of BlockManager (HEAD~1) -> asv continuous -f 1.0 HEAD~1 HEAD. So using the diff formatting to get some color: green is slower and red is faster for the ArrayManager.
The "am-benchmarks" branch I am using is master (of yesterday morning) + a few open close-to-mergeable (all-green) ArrayManager related PRs (#41104 (fillna) , #44736 (interpolate), #44791 (eval)) + the commit to change the default.

I am going to split the results here by topic / file (each time with a small discussion, repeating some stuff from above), but the results of the full run are also included at the bottom.


ToNumpy

$ asv continuous -f 1.01 -b ToNumpy HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+     3.18±0.04μs       11.5±0.1ms  3632.89  frame_methods.ToNumpy.time_values_wide
+     3.59±0.07μs      11.5±0.07ms  3193.82  frame_methods.ToNumpy.time_to_numpy_wide
+     3.18±0.04μs          263±1μs    82.80  frame_methods.ToNumpy.time_values_tall
+     3.64±0.07μs        265±0.6μs    72.79  frame_methods.ToNumpy.time_to_numpy_tall
+      3.70±0.2ms       20.0±0.2ms     5.40  frame_methods.ToNumpy.time_to_numpy_mixed_wide
+      3.74±0.3ms       19.9±0.2ms     5.33  frame_methods.ToNumpy.time_values_mixed_wide
  • All those benchmarks perform much slower for ArrayManager, as is expected. For the slowest case (dataframe with 10,000 columns), we are comparing creating a new ndarray from 10,000 1D arrays vs just returning the single existing array that is backing this DataFrame.
    Creating a new array is always going to be slower, but even for an dataframe with 10,000 columns, I would say it's still fast (11ms)
  • The case of a tall + mixed DataFrame (time_values_mixed_tall) doesn't show up here, so for this case there is no significant difference (in this case a new array needs to be created for both ArrayManager or BlockManager).

reshape

$ asv continuous -f 1.01 -b reshape HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+         210±1μs       80.0±0.6ms   381.47  reshape.ReshapeExtensionDtype.time_transpose('datetime64[ns, US/Pacific]')
+     44.5±0.09ms        184±0.5ms     4.14  reshape.Unstack.time_full_product('int')
+     1.79±0.03ms      7.32±0.03ms     4.09  reshape.ReshapeExtensionDtype.time_unstack_fast('datetime64[ns, US/Pacific]')
+     3.59±0.03ms      11.2±0.04ms     3.10  reshape.SimpleReshape.time_stack
+        97.8±2ms        216±0.4ms     2.21  reshape.Unstack.time_without_last_row('int')
+     5.82±0.07ms      9.65±0.04ms     1.66  reshape.ReshapeExtensionDtype.time_stack('datetime64[ns, US/Pacific]')
+      40.2±0.4ms       51.2±0.3ms     1.27  reshape.ReshapeExtensionDtype.time_transpose('Period[s]')
+     1.98±0.02ms      2.44±0.02ms     1.23  reshape.SimpleReshape.time_unstack
+      80.5±0.8ms       88.7±0.7ms     1.10  reshape.PivotTable.time_pivot_table_margins
-         281±1ms        275±0.9ms     0.98  reshape.WideToLong.time_wide_to_long_big
-      21.0±0.1ms      19.0±0.06ms     0.91  reshape.Crosstab.time_crosstab
-     2.58±0.02ms      2.34±0.03ms     0.90  reshape.ReshapeExtensionDtype.time_unstack_slow('Period[s]')
-      24.5±0.3ms       20.9±0.1ms     0.86  reshape.Unstack.time_full_product('category')
-     2.86±0.01ms      2.20±0.02ms     0.77  reshape.Melt.time_melt_dataframe
-         111±2ms      23.4±0.06ms     0.21  reshape.Unstack.time_without_last_row('category')
  • The big slowdown is in transposing a (10, 1000) shaped DataFrame with all datetimetz columns. Most of the time here is spent in boxing/unboxing Timestamp scalars (because for datetimetz we use object dtype array). I think it would be relatively straightforward to have a specialized method that avoids going through scalars but uses a native numpy dtype for the transpose operation.
    In general, transpose is an operation that would of course always do worse when using a columnar layout in an otherwise single-block case.

  • The case with the biggest slowdown for unstack (reshape.Unstack with int dtype) creates a DataFrame with a shape of 100 rows × 100000 columns (so a very wide DataFrame, and thus a slowdown is expected / acceptable IMO). For the "full product" case (no missing values get introduced), the ArrayManager is "only" 5 times slower compared to reshaping the single block.
    Many of the reshape benchmarks also don't show up above, meaning there is no significant difference in performance for those.

  • (the speedup in reshape.Unstack.time_without_last_row('category') can be ignored, as that has been optimized for BlockManager on master since then (PERF: unstack #44758))

reindex

$ asv continuous -f 1.01 -b reindex HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+     41.1±0.09ms       99.5±0.4ms     2.42  frame_methods.Reindex.time_reindex_axis1_missing
+     3.52±0.07ms      6.93±0.02ms     1.97  frame_methods.Reindex.time_reindex_axis0
+      6.49±0.2ms      9.98±0.03ms     1.54  frame_methods.Reindex.time_reindex_upcast
+        734±40μs      1.03±0.09ms     1.40  reindex.LevelAlign.time_align_level
+        742±30μs      1.00±0.09ms     1.35  reindex.LevelAlign.time_reindex_level
+        1.20±0ms      1.60±0.01ms     1.34  reindex.ReindexMethod.time_reindex_method('pad', <function date_range at 0x7ff1b5af8820>)
+     1.28±0.02ms      1.69±0.02ms     1.33  reindex.ReindexMethod.time_reindex_method('pad', <function period_range at 0x7ff1b5acb670>)
+     1.36±0.02ms      1.71±0.01ms     1.25  reindex.ReindexMethod.time_reindex_method('backfill', <function period_range at 0x7ff1b5acb670>)
+     1.32±0.02ms      1.61±0.03ms     1.23  reindex.ReindexMethod.time_reindex_method('backfill', <function date_range at 0x7ff1b5af8820>)
+      7.66±0.2ms      9.10±0.02ms     1.19  frame_methods.Reindex.time_reindex_both_axes
-         516±4μs        259±0.8μs     0.50  reindex.Reindex.time_reindex_columns
-     30.4±0.06ms       13.3±0.1ms     0.44  frame_methods.Reindex.time_reindex_axis1
  • Reindexing the columns can be faster with ArrayManager (the two last cases with the biggest speedup), or slower when the reindexing introduces many "null" columns (the first case with the biggest slowdown). Personally, I don't worry too much about this case of reindexing with many non-existing columns.
  • Another benchmark with a slowdown is reindexing the rows (frame_methods.Reindex.time_reindex_axis0) with a slowdown factor of ~2. But since this is reindexing a wide (1000 columns) and homogenously dtyped (1 block) DataFrame, I think this is a "worst case", and so an acceptable slowdown IMO.

other frame_methods (leaving out ToNumpy and reindex from above)

$ asv continuous -f 1.01 -b frame_methods HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+         508±4μs       99.7±0.5ms   196.07  frame_methods.Quantile.time_frame_quantile(1)
+      48.7±0.3μs       3.34±0.2ms    68.49  frame_methods.XS.time_frame_xs(0)
+      58.5±0.3μs      1.38±0.01ms    23.52  frame_methods.Dtypes.time_frame_dtypes
+     6.93±0.04ms        124±0.9ms    17.81  frame_methods.MaskBool.time_frame_mask_floats
+         977±5μs      14.3±0.04ms    14.64  frame_methods.GetDtypeCounts.time_frame_get_dtype_counts
+         662±8μs      5.31±0.06ms     8.03  frame_methods.Isnull.time_isnull_floats_no_null
+         664±6μs      5.28±0.05ms     7.96  frame_methods.Isnull.time_isnull
+        34.3±1ms          202±2ms     5.90  frame_methods.MaskBool.time_frame_mask_bools
+      21.5±0.2ms       97.3±0.5ms     4.52  frame_methods.Dropna.time_dropna('any', 1)
+      2.39±0.1ms       10.4±0.2ms     4.36  frame_methods.Equals.time_frame_float_equal
+     25.8±0.05ms       98.1±0.7ms     3.81  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('any', 1)
+     1.85±0.01ms       6.05±0.3ms     3.26  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'datetime64[ns]')
+      57.2±0.4ms          184±2ms     3.22  frame_methods.Count.time_count_level_multi(1)
+     1.85±0.01ms       5.76±0.3ms     3.12  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'timedelta64[ns]')
+      61.6±0.4ms        188±0.6ms     3.06  frame_methods.Count.time_count_level_multi(0)
+     9.34±0.05ms       25.4±0.3ms     2.72  frame_methods.Shift.time_shift(0)
+      72.6±0.5ms         196±10ms     2.70  frame_methods.Count.time_count_level_mixed_dtypes_multi(0)
+      43.0±0.2ms        114±0.5ms     2.65  frame_methods.Iteration.time_iteritems_indexing
+      3.79±0.1ms       9.77±0.2ms     2.58  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'timedelta64[ns]')
+      42.8±0.4ms        110±0.7ms     2.58  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('all', 1)
+      25.3±0.4ms       65.3±0.3ms     2.58  frame_methods.Dropna.time_dropna('any', 0)
+      3.78±0.1ms      9.67±0.01ms     2.56  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'datetime64[ns]')
+      3.75±0.1ms       9.19±0.2ms     2.45  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'timedelta64[ns]')
+      45.0±0.3ms        110±0.6ms     2.44  frame_methods.Dropna.time_dropna('all', 1)
+      3.75±0.1ms      9.06±0.05ms     2.42  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'datetime64[ns]')
+      28.5±0.4ms       67.5±0.2ms     2.36  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('any', 0)
+      85.0±0.3ms         195±10ms     2.29  frame_methods.Count.time_count_level_mixed_dtypes_multi(1)
+      3.06±0.2ms      6.94±0.06ms     2.27  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'timedelta64[ns]')
+      3.08±0.2ms       6.94±0.1ms     2.25  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'datetime64[ns]')
+      12.0±0.1ms       24.8±0.7ms     2.07  frame_methods.Iteration.time_items
+      41.5±0.5ms       81.9±0.4ms     1.97  frame_methods.Dropna.time_dropna('all', 0)
+         516±3μs      1.00±0.03ms     1.94  frame_methods.Iteration.time_itertuples_start
+         365±1μs         686±20μs     1.88  frame_methods.Iteration.time_itertuples_raw_start
+         366±2μs         686±10μs     1.87  frame_methods.Iteration.time_itertuples_raw_read_first
+         523±4μs         976±30μs     1.86  frame_methods.Iteration.time_itertuples_read_first
+      51.8±0.2ms       85.9±0.5ms     1.66  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('all', 0)
+         727±9μs      1.19±0.04ms     1.64  frame_methods.Iteration.time_items_cached
+     3.25±0.02μs       5.28±0.5μs     1.62  frame_methods.XS.time_frame_xs(1)
+         353±6μs          572±5μs     1.62  frame_methods.Quantile.time_frame_quantile(0)
+      7.73±0.6ms       11.1±0.1ms     1.44  frame_methods.Equals.time_frame_float_unequal
+        49.3±3ms       68.6±0.6ms     1.39  frame_methods.Equals.time_frame_object_unequal
+      32.0±0.3μs       44.1±0.4μs     1.38  frame_methods.GetNumericData.time_frame_get_numeric_data
+      69.6±0.2ms       92.9±0.4ms     1.34  frame_methods.Repr.time_frame_repr_wide
+     37.0±0.05ms       48.7±0.3ms     1.32  frame_methods.Equals.time_frame_nonunique_equal
+     37.2±0.05ms       49.0±0.1ms     1.32  frame_methods.Equals.time_frame_nonunique_unequal
+     4.74±0.05ms      6.09±0.03ms     1.29  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'float32')
+     5.37±0.06ms      6.81±0.04ms     1.27  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'float64')
+         208±1ms          262±2ms     1.26  frame_methods.GetDtypeCounts.time_info
+         248±3ms          311±1ms     1.25  frame_methods.Iteration.time_iterrows
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw_read_first
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw_start
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_start
+      43.2±0.2ms       51.0±0.2ms     1.18  frame_methods.Isnull.time_isnull_obj
+     4.68±0.03ms      5.49±0.02ms     1.17  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'float32')
+     4.80±0.02μs      5.50±0.08μs     1.15  frame_methods.ToDict.time_to_dict_ints('series')
+     1.70±0.01ms      1.93±0.04ms     1.14  frame_methods.Interpolate.time_interpolate_some_good(None)
+     4.82±0.02μs      5.47±0.03μs     1.14  frame_methods.ToDict.time_to_dict_datetimelike('series')
+     3.91±0.04ms      4.44±0.05ms     1.13  frame_methods.Rank.time_rank('uint')
+     3.93±0.03ms      4.43±0.03ms     1.13  frame_methods.Rank.time_rank('int')
+     4.27±0.02ms      4.78±0.04ms     1.12  frame_methods.Lookup.time_frame_fancy_lookup
+      17.1±0.2ms      19.0±0.09ms     1.11  frame_methods.ToDict.time_to_dict_ints('index')
+         157±2ms          172±6ms     1.09  frame_methods.ToDict.time_to_dict_datetimelike('list')
+         167±2ms          181±7ms     1.09  frame_methods.ToDict.time_to_dict_datetimelike('index')
+         173±1ms          188±7ms     1.08  frame_methods.ToDict.time_to_dict_datetimelike('split')
+     3.69±0.02ms      3.93±0.04ms     1.07  frame_methods.Interpolate.time_interpolate_some_good('infer')
+      89.6±0.8ms       95.1±0.2ms     1.06  frame_methods.Interpolate.time_interpolate(None)
+     10.5±0.05ms      10.9±0.02ms     1.04  frame_methods.Rank.time_rank('float')
+     6.49±0.03ms       6.72±0.1ms     1.03  frame_methods.Repr.time_html_repr_trunc_mi
+       731±0.6ms          743±1ms     1.02  frame_methods.Iteration.time_itertuples_raw_tuples
+      56.2±0.2ms       56.9±0.3ms     1.01  frame_methods.ToHTML.time_to_html_mixed
-       107±0.3ms        103±0.6ms     0.96  frame_methods.Apply.time_apply_axis_1
-     4.73±0.09ms      4.13±0.07ms     0.87  frame_methods.Apply.time_apply_pass_thru
-         460±1μs        371±0.9μs     0.81  frame_methods.Shift.time_shift(1)
-     5.95±0.05ms      4.70±0.03ms     0.79  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'Float64')
-     7.40±0.05ms      5.84±0.03ms     0.79  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'float64')
-     6.52±0.04ms      5.10±0.04ms     0.78  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'Int64')
-     5.90±0.03ms      4.59±0.02ms     0.78  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'Int64')
-     6.64±0.03ms      5.14±0.04ms     0.77  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'Float64')
-     5.99±0.07ms      4.60±0.05ms     0.77  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'Float64')
-     6.00±0.04ms      4.60±0.06ms     0.77  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'Int64')
-     9.56±0.08ms      7.24±0.04ms     0.76  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'datetime64[ns, tz]')
-     7.22±0.08ms      5.46±0.03ms     0.76  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'float32')
-      5.84±0.2ms       4.38±0.3ms     0.75  frame_methods.NSort.time_nlargest_one_column('all')
-      5.18±0.2ms       3.87±0.2ms     0.75  frame_methods.NSort.time_nlargest_one_column('last')
-      5.88±0.2ms       4.36±0.3ms     0.74  frame_methods.NSort.time_nlargest_one_column('first')
-     8.19±0.05ms       5.92±0.1ms     0.72  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'datetime64[ns, tz]')
-     7.87±0.08ms      5.68±0.04ms     0.72  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'datetime64[ns, tz]')
-      7.42±0.1ms      5.26±0.01ms     0.71  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'float64')
-     7.14±0.08ms      4.79±0.02ms     0.67  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'float32')
-     4.58±0.01ms      3.04±0.02ms     0.66  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'Float64')
-     4.59±0.01ms      3.04±0.02ms     0.66  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'Int64')
-         632±5ms          401±1ms     0.64  frame_methods.Nunique.time_frame_nunique
-         309±3ms          180±2ms     0.58  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'object')
-         314±2ms          180±1ms     0.57  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'object')
-         525±4ms          238±2ms     0.45  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'object')
-         526±8ms          226±1ms     0.43  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'object')
-      51.1±0.2ms      20.2±0.05ms     0.40  frame_methods.Rename.time_rename_both_axes
-      51.1±0.1ms       20.1±0.2ms     0.39  frame_methods.Rename.time_dict_rename_both_axes
-      49.3±0.1ms      18.3±0.07ms     0.37  frame_methods.Rename.time_rename_axis0
-      47.1±0.3ms       16.4±0.2ms     0.35  frame_methods.Rename.time_rename_single
-      44.8±0.2ms      14.2±0.05ms     0.32  frame_methods.Rename.time_rename_axis1
  • The quantile with axis=1 is much slower (similar as reductions over the rows instead of the columns, in general, see below in the "Reductions" section). In this case it will probably be more efficient to calculate the quantiles on the 2D array instead of column-by-column (since we already transpose the DataFrame in case of axis=1). This is also what happens for the other row-wise reductions, which only show a 1-5x slowdown

  • XS.time_frame_xs(0) selects a row as a Series from a homogeneously dtyped DataFrame with 10,000 columns. So constructing the array for the Series instead of selecting from the 2D block array is of course more expensive.

  • There are some slowdowns in isnull related benchmarks: 1) those are using square DataFrames with shape of (1000, 1000) (take a 10000x100 instead, and there is hardly a difference anymore), and 2) some overhead can easily be avoided (see eg jorisvandenbossche@2921441, which uses isna_array instead of isna in the ArrayManager method, and optimizes some dtype checks)

  • The MaskBool benchmarks still go through BlockManager.apply, causing some overhead (this is a TODO in ArrayManager).

join_merge

$ asv continuous -f 1.01 -b join_merge HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+        35.9±3ms         81.5±1ms     2.27  join_merge.ConcatDataFrames.time_c_ordered(0, True)
+        36.3±3ms         82.1±2ms     2.26  join_merge.ConcatDataFrames.time_c_ordered(0, False)
+        40.7±6ms         80.5±2ms     1.98  join_merge.ConcatDataFrames.time_f_ordered(0, True)
+        41.8±5ms         81.3±1ms     1.95  join_merge.ConcatDataFrames.time_f_ordered(0, False)
+      50.6±0.6ms         88.6±2ms     1.75  join_merge.ConcatDataFrames.time_f_ordered(1, False)
+        51.0±4ms         87.6±2ms     1.72  join_merge.ConcatDataFrames.time_f_ordered(1, True)
+       253±0.7ms        404±0.6ms     1.60  join_merge.Merge.time_merge_dataframes_cross(True)
+         254±2ms        403±0.5ms     1.59  join_merge.Merge.time_merge_dataframes_cross(False)
+     8.17±0.04ms      12.5±0.03ms     1.53  join_merge.Concat.time_concat_small_frames(1)
+         399±3ms        587±0.9ms     1.47  join_merge.MergeCategoricals.time_merge_object
+      9.07±0.4ms       12.1±0.3ms     1.33  join_merge.Join.time_join_dataframe_index_single_key_small(True)
+      11.3±0.2ms       14.9±0.2ms     1.32  join_merge.Join.time_join_dataframe_index_single_key_bigger(True)
+      11.3±0.2ms       14.8±0.4ms     1.32  join_merge.Join.time_join_dataframe_index_shuffle_key_bigger_sort(True)
+     9.33±0.03ms       11.2±0.1ms     1.20  join_merge.Concat.time_concat_small_frames(0)
+      36.5±0.6ms       40.0±0.5ms     1.09  join_merge.Merge.time_merge_2intkey(True)
-       253±0.4μs          244±2μs     0.97  join_merge.Concat.time_concat_empty_right(0)
-         218±1μs          209±1μs     0.96  join_merge.Concat.time_concat_empty_right(1)
-         252±1μs          242±2μs     0.96  join_merge.Concat.time_concat_empty_left(0)
-     3.19±0.02ms      3.04±0.03ms     0.95  join_merge.Join.time_join_dataframes_cross(False)
-       208±0.6ms        198±0.6ms     0.95  join_merge.MergeCategoricals.time_merge_cat
-     19.9±0.06ms      18.7±0.05ms     0.94  join_merge.MergeAsof.time_on_int32('nearest', 5)
-     19.2±0.05ms      18.0±0.05ms     0.94  join_merge.MergeAsof.time_on_int('nearest', 5)
-     18.0±0.03ms      16.9±0.06ms     0.94  join_merge.MergeAsof.time_on_uint64('nearest', 5)
-     19.2±0.09ms      17.9±0.03ms     0.94  join_merge.MergeAsof.time_on_int32('nearest', None)
-     18.7±0.09ms      17.5±0.05ms     0.94  join_merge.MergeAsof.time_on_int('nearest', None)
-     17.3±0.09ms      16.2±0.08ms     0.93  join_merge.MergeAsof.time_on_uint64('nearest', None)
-     15.3±0.08ms      14.2±0.03ms     0.93  join_merge.MergeAsof.time_on_int('forward', 5)
-      72.7±0.2ms       67.2±0.3ms     0.92  join_merge.MergeOrdered.time_merge_ordered
-     15.2±0.01ms      14.0±0.08ms     0.92  join_merge.MergeAsof.time_on_int('forward', None)
-      16.4±0.1ms      15.1±0.09ms     0.92  join_merge.MergeAsof.time_on_int32('forward', 5)
-     14.5±0.05ms      13.3±0.08ms     0.91  join_merge.MergeAsof.time_on_uint64('forward', 5)
-     13.7±0.04ms      12.5±0.06ms     0.91  join_merge.MergeAsof.time_on_int('backward', 5)
-     15.7±0.07ms      14.3±0.05ms     0.91  join_merge.MergeAsof.time_on_int32('backward', 5)
-     13.5±0.02ms      12.3±0.09ms     0.91  join_merge.MergeAsof.time_on_int('backward', None)
-     14.2±0.04ms      12.9±0.09ms     0.91  join_merge.MergeAsof.time_on_uint64('forward', None)
-     15.3±0.09ms      13.9±0.03ms     0.91  join_merge.MergeAsof.time_on_int32('backward', None)
-     2.14±0.01ms      1.94±0.01ms     0.91  join_merge.Merge.time_merge_dataframe_integer_key(True)
-     13.5±0.05ms      12.2±0.03ms     0.91  join_merge.MergeAsof.time_on_uint64('backward', 5)
-     13.2±0.05ms      11.9±0.05ms     0.90  join_merge.MergeAsof.time_on_uint64('backward', None)
-         594±4μs          526±5μs     0.89  join_merge.Append.time_append_mixed
-     1.82±0.02ms         1.61±0ms     0.88  join_merge.Merge.time_merge_dataframe_integer_key(False)
-      86.5±0.5ms       71.2±0.3ms     0.82  join_merge.Concat.time_concat_series(1)
-         818±2ms         672±10ms     0.82  join_merge.I8Merge.time_i8merge('inner')
-         929±8ms          761±4ms     0.82  join_merge.I8Merge.time_i8merge('right')
-         819±1ms          671±8ms     0.82  join_merge.I8Merge.time_i8merge('outer')
-         854±9ms          684±8ms     0.80  join_merge.I8Merge.time_i8merge('left')
  • Many of the benchmarks are quite similar (not shown, a bit faster or a bit slower), mostly except for the concat( , axis=0) cases.
  • The concat(.., axis=0) case that shows a 2x slowdown with ArrayManager is the expected case, I think. That specific benchmark is using a DataFrame with a single float dtype with 200 columns (single block) and concatting this 20 times, so concatenating 20 2D arrays is always going to be faster as concatenating 200 times 20 1D arrays (the benchmark case has 200 columns, and does pd.concat([df] * 20, axis=0)). From profiling the operation, almost all time is spent in the actual numpy concatenation routine (for both cases), so I don't expect there is much room for improvement here.

groupby

$ asv continuous -f 1.01 -b groupby HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+     4.01±0.06ms       54.9±0.5ms    13.71  groupby.GroupManyLabels.time_sum(1000)
+       112±0.7μs          382±2μs     3.41  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumsum', 'direct', 5)
+       113±0.5μs          384±3μs     3.39  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'direct', 5)
+       115±0.5μs          387±2μs     3.37  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'direct', 5)
+         344±4μs      1.01±0.02ms     2.93  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumprod', 'direct', 5)
+         349±3μs      1.02±0.01ms     2.91  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'direct', 5)
+         351±3μs      1.02±0.01ms     2.90  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'direct', 5)
+         127±1μs        354±0.9μs     2.79  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummax', 'direct', 5)
+       126±0.6μs        350±0.9μs     2.78  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummin', 'direct', 5)
+         120±1μs          333±1μs     2.77  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'direct', 5)
+       129±0.8μs          356±1μs     2.75  groupby.GroupByMethods.time_dtype_as_group('int', 'cummax', 'direct', 5)
+       119±0.3μs          325±1μs     2.72  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'direct', 5)
+       129±0.7μs        349±0.8μs     2.71  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'direct', 5)
+         121±2μs        326±0.7μs     2.70  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'direct', 5)
+         236±2μs          628±9μs     2.66  groupby.GroupByMethods.time_dtype_as_group('uint', 'var', 'direct', 5)
+         240±2μs          627±4μs     2.61  groupby.GroupByMethods.time_dtype_as_group('uint', 'mean', 'direct', 5)
+         240±1μs          623±2μs     2.60  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'direct', 5)
+         244±1μs          627±3μs     2.58  groupby.GroupByMethods.time_dtype_as_group('int', 'mean', 'direct', 5)
+         240±2μs          608±5μs     2.54  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'direct', 5)
+         263±2μs          660±3μs     2.51  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct', 5)
+       113±0.8μs          275±3μs     2.42  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct', 5)
+       112±0.9μs          270±2μs     2.40  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'direct', 5)
+       108±0.4μs        258±0.4μs     2.39  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'direct', 5)
+       114±0.8μs          269±2μs     2.37  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct', 5)
+       114±0.3μs        267±0.6μs     2.35  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'direct', 5)
+       115±0.7μs          269±1μs     2.34  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct', 5)
+       182±0.9μs          426±3μs     2.34  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'direct', 5)
+         116±1μs          271±2μs     2.34  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'direct', 5)
+         115±2μs          267±2μs     2.33  groupby.GroupByMethods.time_dtype_as_group('uint', 'all', 'direct', 5)
+         111±1μs          257±2μs     2.33  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'direct', 5)
+         316±1μs          731±4μs     2.31  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'direct', 5)
+         116±1μs        268±0.9μs     2.30  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct', 5)
+         186±2μs          426±3μs     2.28  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'direct', 5)
+       185±0.8μs          412±4μs     2.23  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'direct', 5)
+         355±1μs          789±9μs     2.23  groupby.GroupByMethods.time_dtype_as_group('uint', 'median', 'direct', 5)
+         359±2μs          785±5μs     2.19  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'direct', 5)
+         747±7μs      1.56±0.01ms     2.09  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'direct', 5)
+         746±8μs      1.55±0.01ms     2.08  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'direct', 5)
+         799±4μs      1.64±0.02ms     2.06  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'direct', 5)
+         766±4μs      1.57±0.02ms     2.05  groupby.GroupByMethods.time_dtype_as_group('uint', 'sum', 'direct', 5)
+         773±4μs      1.58±0.01ms     2.04  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'direct', 5)
+      33.3±0.6ms       67.4±0.9ms     2.02  groupby.GroupByCythonAgg.time_frame_agg('float64', 'prod')
+         825±5μs      1.64±0.02ms     1.99  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'direct', 5)
+        13.4±3ms      24.8±0.08ms     1.84  groupby.Cumulative.time_frame_transform('int64', 'cumsum')
+      36.4±0.6ms       67.1±0.8ms     1.84  groupby.GroupByCythonAgg.time_frame_agg('float64', 'first')
+      45.2±0.6ms         82.2±1ms     1.82  groupby.GroupByCythonAgg.time_frame_agg('float64', 'sum')
+      44.9±0.7ms       81.5±0.8ms     1.82  groupby.GroupByCythonAgg.time_frame_agg('float64', 'mean')
+      44.4±0.7ms         79.1±2ms     1.78  groupby.GroupByCythonAgg.time_frame_agg('float64', 'var')
+         524±2μs          918±3μs     1.75  groupby.GroupByMethods.time_dtype_as_group('uint', 'min', 'direct', 5)
+         537±1μs         940±20μs     1.75  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'direct', 5)
+         518±3μs         904±30μs     1.74  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'direct', 5)
+       116±0.4μs          203±1μs     1.74  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct', 5)
+         456±2μs          792±6μs     1.74  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct', 5)
+         515±9μs         891±70μs     1.73  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'direct', 5)
+         534±2μs         921±20μs     1.72  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'direct', 5)
+         532±1μs          915±4μs     1.72  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'direct', 5)
+       523±0.9μs          900±4μs     1.72  groupby.GroupByMethods.time_dtype_as_group('int', 'first', 'direct', 5)
+         537±2μs          924±7μs     1.72  groupby.GroupByMethods.time_dtype_as_group('int', 'max', 'direct', 5)
+         526±9μs          900±8μs     1.71  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'direct', 5)
+         544±3μs          931±6μs     1.71  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct', 5)
+       538±0.8μs          915±4μs     1.70  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct', 5)
+         457±2μs          777±5μs     1.70  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'direct', 5)
+         539±4μs          915±7μs     1.70  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'direct', 5)
+        86.8±1ms          147±1ms     1.70  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'direct', 5)
+         516±2μs          874±7μs     1.69  groupby.GroupByMethods.time_dtype_as_group('uint', 'last', 'direct', 5)
+         533±2μs          897±9μs     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'direct', 5)
+      56.8±0.3ms       95.7±0.5ms     1.68  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'direct', 5)
+        88.2±1ms          148±1ms     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'transformation', 5)
+         536±4μs          901±5μs     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct', 5)
+      56.6±0.3ms         95.0±1ms     1.68  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'direct', 5)
+         519±4μs          866±9μs     1.67  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct', 5)
+      58.1±0.5ms       96.7±0.4ms     1.67  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'transformation', 5)
+      58.0±0.3ms       96.6±0.3ms     1.66  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'transformation', 5)
+        50.1±2ms         81.9±1ms     1.64  groupby.GroupByCythonAgg.time_frame_agg('float64', 'any')
+        51.0±2ms         81.9±1ms     1.61  groupby.GroupByCythonAgg.time_frame_agg('float64', 'all')
+      40.4±0.5ms       64.5±0.7ms     1.60  groupby.GroupByCythonAgg.time_frame_agg('float64', 'last')
+         132±1μs          207±1μs     1.56  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct', 5)
+       131±0.6μs          203±2μs     1.56  groupby.GroupByMethods.time_dtype_as_group('uint', 'count', 'direct', 5)
+         136±1μs          209±1μs     1.54  groupby.GroupByMethods.time_dtype_as_group('float', 'count', 'direct', 5)
+       128±0.6μs        197±0.9μs     1.53  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct', 5)
+      47.3±0.7ms       71.0±0.6ms     1.50  groupby.GroupByCythonAgg.time_frame_agg('float64', 'min')
+      47.5±0.7ms         71.1±1ms     1.50  groupby.GroupByCythonAgg.time_frame_agg('float64', 'max')
+        15.9±3ms      22.9±0.05ms     1.44  groupby.Cumulative.time_frame_transform('int64', 'cummin')
+        14.2±2ms      20.6±0.04ms     1.44  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cumsum')
+      14.4±0.9ms       20.6±0.1ms     1.43  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cumsum')
+        16.0±2ms      22.8±0.06ms     1.43  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cummin')
+      16.1±0.9ms       22.9±0.3ms     1.42  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cummin')
+         176±2ms          250±1ms     1.42  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'direct', 5)
+      17.4±0.9ms       24.7±0.1ms     1.42  groupby.Cumulative.time_frame_transform('float64', 'cummin')
+        16.8±3ms      23.8±0.08ms     1.42  groupby.Cumulative.time_frame_transform('int64', 'cummax')
+         177±2ms          251±2ms     1.41  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'transformation', 5)
+         114±1ms        161±0.8ms     1.41  groupby.GroupByMethods.time_dtype_as_group('uint', 'mad', 'direct', 5)
+        16.3±3ms      22.9±0.04ms     1.40  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cummax')
+         116±1ms        162±0.9ms     1.40  groupby.GroupByMethods.time_dtype_as_group('uint', 'mad', 'transformation', 5)
+         114±1ms          160±1ms     1.40  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'direct', 5)
+         116±1ms        163±0.7ms     1.40  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'transformation', 5)
+      16.6±0.9ms      23.0±0.04ms     1.39  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cummax')
+      15.9±0.8ms      21.9±0.06ms     1.38  groupby.Cumulative.time_frame_transform('float64', 'cumsum')
+      18.8±0.7ms      25.2±0.07ms     1.34  groupby.Cumulative.time_frame_transform('float64', 'cummax')
+         848±9ms       1.13±0.03s     1.33  groupby.String.time_str_func('string[python]', 'any')
+        848±10ms       1.13±0.03s     1.33  groupby.String.time_str_func('string[python]', 'all')
+     1.83±0.01ms      2.38±0.02ms     1.30  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'transformation', 5)
+     1.74±0.01ms      2.27±0.01ms     1.30  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumprod', 'transformation', 5)
+     2.31±0.02ms      2.99±0.03ms     1.29  groupby.GroupByMethods.time_dtype_as_group('uint', 'sum', 'transformation', 5)
+     1.77±0.01ms      2.28±0.01ms     1.29  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'transformation', 5)
+     2.29±0.02ms      2.95±0.03ms     1.28  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'transformation', 5)
+      1.01±0.01s       1.29±0.03s     1.28  groupby.String.time_str_func('string[python]', 'first')
+      1.02±0.01s       1.31±0.02s     1.28  groupby.String.time_str_func('string[python]', 'last')
+         606±2μs          775±7μs     1.28  groupby.Datelike.time_sum('date_range')
+      22.2±0.2ms       28.4±0.1ms     1.28  groupby.Cumulative.time_frame_transform('Int64', 'cummax')
+     22.0±0.05ms      28.1±0.09ms     1.28  groupby.Cumulative.time_frame_transform('Int64', 'cummin')
+     2.33±0.01ms      2.94±0.02ms     1.26  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'transformation', 5)
+     2.46±0.02ms      3.10±0.03ms     1.26  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'transformation', 5)
+     2.35±0.02ms      2.95±0.02ms     1.26  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'transformation', 5)
+         643±3μs          803±4μs     1.25  groupby.Datelike.time_sum('date_range_tz')
+     1.97±0.02ms      2.46±0.02ms     1.25  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct', 5)
+     2.48±0.03ms      3.10±0.02ms     1.25  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'transformation', 5)
+     1.97±0.04ms      2.45±0.03ms     1.25  groupby.GroupByMethods.time_dtype_as_group('uint', 'sem', 'direct', 5)
+     2.04±0.02ms      2.49±0.01ms     1.22  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct', 5)
+        1.15±0ms         1.41±0ms     1.22  groupby.GroupByMethods.time_dtype_as_group('object', 'rank', 'direct', 5)
+     1.72±0.03ms       2.04±0.1ms     1.18  groupby.GroupByMethods.time_dtype_as_group('datetime', 'quantile', 'direct', 5)
+        1.65±0ms      1.92±0.01ms     1.17  groupby.GroupByMethods.time_dtype_as_group('int', 'quantile', 'direct', 5)
+     1.92±0.01ms      2.23±0.02ms     1.16  groupby.GroupByMethods.time_dtype_as_group('uint', 'median', 'transformation', 5)
+         459±2μs          531±2μs     1.16  groupby.GroupManyLabels.time_sum(1)
+     1.83±0.01ms      2.11±0.02ms     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'transformation', 5)
+     1.94±0.02ms      2.23±0.02ms     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'transformation', 5)
+     1.99±0.01ms      2.29±0.03ms     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'transformation', 5)
+        1.75±0ms      2.01±0.01ms     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'rank', 'direct', 5)
+     1.67±0.01ms      1.91±0.01ms     1.15  groupby.GroupByMethods.time_dtype_as_group('uint', 'quantile', 'direct', 5)
+     11.6±0.08ms       13.3±0.2ms     1.14  groupby.Apply.time_scalar_function_multi_col(5)
+     1.74±0.01ms         1.99±0ms     1.14  groupby.GroupByMethods.time_dtype_as_group('datetime', 'rank', 'direct', 5)
+     1.78±0.01ms      2.04±0.01ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'rank', 'direct', 5)
+     1.83±0.01ms      2.09±0.02ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'mean', 'transformation', 5)
+        1.79±0ms      2.04±0.01ms     1.14  groupby.GroupByMethods.time_dtype_as_group('int', 'rank', 'direct', 5)
+     2.07±0.01ms      2.35±0.03ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'transformation', 5)
+        1.69±0ms         1.92±0ms     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'quantile', 'direct', 5)
+     2.05±0.02ms         2.32±0ms     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'min', 'transformation', 5)
+     1.94±0.01ms      2.19±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'transformation', 5)
+      28.2±0.5ms       31.9±0.2ms     1.13  groupby.Nth.time_groupby_nth_all('datetime')
+     2.03±0.01ms      2.30±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'transformation', 5)
+     1.96±0.01ms      2.22±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'transformation', 5)
+      89.3±0.6μs        101±0.9μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'direct', 1)
+       100±0.7μs        113±0.7μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'direct', 5)
+     2.07±0.02ms      2.33±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'transformation', 5)
+      17.7±0.3ms       19.9±0.5ms     1.13  groupby.Cumulative.time_frame_transform_many_nulls('Int64', 'cummax')
+         1.07±0s       1.21±0.02s     1.13  groupby.String.time_str_func('str', 'first')
+     2.06±0.03ms      2.32±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'max', 'transformation', 5)
+     2.15±0.01ms      2.42±0.02ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'transformation', 5)
+         1.09±0s       1.23±0.02s     1.12  groupby.String.time_str_func('str', 'last')
+     17.6±0.02ms       19.8±0.1ms     1.12  groupby.Cumulative.time_frame_transform_many_nulls('Int64', 'cummin')
+      20.9±0.4ms       23.4±0.7ms     1.12  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummin')
+     3.41±0.02ms      3.82±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'transformation', 5)
+     2.15±0.01ms      2.41±0.04ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'transformation', 5)
+     1.46±0.01ms         1.64±0ms     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumsum', 'transformation', 5)
+     2.16±0.01ms      2.42±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'transformation', 5)
+     1.33±0.02ms      1.49±0.03ms     1.12  groupby.Datelike.time_sum('period_range')
+     2.18±0.02ms      2.43±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'transformation', 5)
+     2.04±0.02ms      2.28±0.03ms     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'last', 'transformation', 5)
+       102±0.3μs          114±1μs     1.12  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 1)
+     1.89±0.01ms      2.12±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'transformation', 5)
+     11.4±0.03ms       12.7±0.2ms     1.12  groupby.Float32.time_sum
+     3.42±0.06ms      3.81±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('uint', 'sem', 'transformation', 5)
+     1.88±0.02ms      2.09±0.02ms     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'mean', 'transformation', 5)
+       112±0.4μs        124±0.7μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct', 5)
+     1.57±0.01ms      1.74±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'transformation', 5)
+     21.8±0.04ms       24.2±0.1ms     1.11  groupby.Cumulative.time_frame_transform('Float64', 'cummax')
+     1.48±0.02ms      1.64±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'transformation', 5)
+      20.7±0.3ms      22.9±0.08ms     1.11  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummax')
+     1.91±0.01ms      2.11±0.02ms     1.10  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'transformation', 5)
+         115±1μs        127±0.6μs     1.10  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 5)
+     1.47±0.01ms      1.62±0.01ms     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummax', 'transformation', 5)
+     2.05±0.02ms      2.26±0.02ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'transformation', 5)
+     1.47±0.01ms      1.61±0.01ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'transformation', 5)
+      22.4±0.1ms      24.6±0.06ms     1.10  groupby.Cumulative.time_frame_transform('Float64', 'cummin')
+      91.6±0.9μs          100±1μs     1.09  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 5)
+         891±4μs          972±6μs     1.09  groupby.SumMultiLevel.time_groupby_sum_multiindex
+     1.56±0.01ms         1.69±0ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'transformation', 5)
+     1.76±0.01ms      1.90±0.01ms     1.08  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'transformation', 5)
+      74.9±0.6μs       81.1±0.1μs     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'head', 'direct', 1)
+      74.0±0.4μs       80.1±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('datetime', 'head', 'direct', 1)
+      82.4±0.7μs       89.1±0.6μs     1.08  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 1)
+     1.46±0.01ms      1.58±0.01ms     1.08  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'transformation', 5)
+      83.7±0.4μs       90.5±0.8μs     1.08  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct', 5)
+       109±0.3μs        118±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'direct', 5)
+      6.23±0.1ms      6.73±0.03ms     1.08  groupby.Apply.time_scalar_function_single_col(5)
+      74.6±0.8μs       80.6±0.3μs     1.08  groupby.GroupByMethods.time_dtype_as_group('uint', 'head', 'direct', 1)
+     3.68±0.02ms      3.98±0.03ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'transformation', 5)
+      67.7±0.7μs       73.1±0.6μs     1.08  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 1)
+     1.58±0.02ms      1.70±0.02ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'transformation', 5)
+       109±0.8μs        118±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'direct', 5)
+      74.3±0.7μs       79.9±0.2μs     1.08  groupby.GroupByMethods.time_dtype_as_field('float', 'head', 'direct', 1)
+         146±2μs        157±0.8μs     1.08  groupby.GroupByMethods.time_dtype_as_field('int', 'tail', 'direct', 1)
+      83.6±0.3μs       89.7±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_field('float', 'head', 'direct', 5)
+      74.9±0.1μs       80.4±0.4μs     1.07  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct', 1)
+       107±0.8μs        115±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'direct', 5)
+     2.35±0.01ms      2.51±0.01ms     1.07  groupby.GroupByMethods.time_dtype_as_group('object', 'rank', 'transformation', 5)
+         148±2μs        158±0.7μs     1.07  groupby.GroupByMethods.time_dtype_as_field('uint', 'tail', 'direct', 1)
+         144±2μs        154±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_group('uint', 'tail', 'direct', 1)
+      74.9±0.4μs       80.0±0.3μs     1.07  groupby.GroupByMethods.time_dtype_as_field('uint', 'head', 'direct', 1)
+     1.78±0.01ms      1.90±0.01ms     1.07  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'transformation', 5)
+      35.9±0.2ms       38.2±0.5ms     1.06  groupby.Nth.time_groupby_nth_all('object')
+     28.5±0.08ms      30.3±0.07ms     1.06  rolling.Pairwise.time_groupby(({}, 'expanding'), 'cov', False)
+         134±1μs          142±1μs     1.06  groupby.GroupByMethods.time_dtype_as_group('datetime', 'tail', 'direct', 1)
+      76.1±0.8μs       80.8±0.2μs     1.06  groupby.GroupByMethods.time_dtype_as_group('int', 'head', 'direct', 1)
+     30.1±0.06ms       31.9±0.2ms     1.06  rolling.Pairwise.time_groupby(({'window': 1000}, 'rolling'), 'cov', False)
+      41.3±0.3ms       43.8±0.4ms     1.06  groupby.Nth.time_frame_nth_any('object')
+     30.0±0.05ms      31.7±0.05ms     1.06  rolling.Pairwise.time_groupby(({'window': 10}, 'rolling'), 'cov', False)
+     3.11±0.01ms      3.29±0.02ms     1.06  groupby.GroupByMethods.time_dtype_as_group('uint', 'quantile', 'transformation', 5)
+         135±1μs          142±2μs     1.05  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct', 1)
+         260±1μs          273±2μs     1.05  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct', 5)
+      30.6±0.1ms       32.2±0.1ms     1.05  rolling.Pairwise.time_groupby(({'window': 10}, 'rolling'), 'corr', False)
+     1.89±0.01ms      1.99±0.01ms     1.05  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'transformation', 5)
+         157±1μs        165±0.6μs     1.05  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 1)
+         262±1μs          275±3μs     1.05  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'direct', 5)
+         167±1μs          175±2μs     1.05  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'direct', 5)
+       166±0.8μs          174±1μs     1.05  groupby.GroupByMethods.time_dtype_as_field('float', 'tail', 'direct', 5)
+         176±2μs        185±0.7μs     1.05  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 5)
+       116±0.7μs        121±0.3μs     1.05  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct', 5)
+     20.3±0.07ms      21.3±0.05ms     1.05  groupby.AggFunctions.time_different_python_functions_multicol
+     3.04±0.01ms         3.18±0ms     1.04  groupby.GroupByMethods.time_dtype_as_group('int', 'rank', 'transformation', 5)
+     3.23±0.02ms      3.37±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('float', 'quantile', 'transformation', 5)
+       120±0.9μs        125±0.6μs     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'shift', 'direct', 5)
+      33.6±0.2ms       35.0±0.8ms     1.04  groupby.Nth.time_series_nth_all('float32')
+     3.05±0.02ms      3.18±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'rank', 'transformation', 5)
+     1.56±0.01ms      1.63±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'pct_change', 'direct', 5)
+       261±0.9μs          272±3μs     1.04  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'direct', 5)
+     1.57±0.01ms      1.63±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'transformation', 5)
+     38.8±0.06ms       40.2±0.1ms     1.04  groupby.Nth.time_series_nth_any('object')
+       188±0.7μs          194±3μs     1.03  groupby.GroupByMethods.time_dtype_as_field('uint', 'first', 'direct', 5)
+         540±3μs        558±0.8μs     1.03  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'transformation', 1)
+       227±0.7ms        234±0.5ms     1.03  groupby.AggFunctions.time_different_python_functions_singlecol
+     1.68±0.01ms      1.72±0.02ms     1.03  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'transformation', 5)
+        1.63±0ms      1.67±0.02ms     1.03  groupby.GroupByMethods.time_dtype_as_group('float', 'pct_change', 'direct', 5)
+       189±0.5μs        195±0.6μs     1.03  groupby.GroupByMethods.time_dtype_as_field('uint', 'max', 'direct', 5)
+       389±0.9μs          398±2μs     1.02  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct', 5)
+        2.01±0ms      2.06±0.01ms     1.02  groupby.GroupByMethods.time_dtype_as_field('object', 'rank', 'transformation', 1)
+       192±0.3μs        197±0.5μs     1.02  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct', 5)
+       198±0.3ms        200±0.7ms     1.01  groupby.Cumulative.time_frame_transform('Float64', 'cumsum')
-         719±2μs        712±0.9μs     0.99  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation', 1)
-       320±0.7μs        316±0.6μs     0.99  groupby.GroupByMethods.time_dtype_as_field('object', 'bfill', 'direct', 1)
-         632±2μs          622±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation', 1)
-         392±1μs          385±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'direct', 5)
-     1.37±0.01ms      1.35±0.01ms     0.98  groupby.RankWithTies.time_rank_ties('float32', 'dense')
-       227±0.8μs        223±0.3μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'direct', 1)
-         208±1μs        204±0.3μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'bfill', 'direct', 1)
-     1.08±0.01ms      1.06±0.01ms     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'pct_change', 'direct', 1)
-      51.9±0.2ms       50.8±0.5ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'describe', 'direct', 5)
-     1.02±0.01ms         1.00±0ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'pct_change', 'direct', 1)
-       221±0.6μs        217±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct', 1)
-         495±2μs          485±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'sem', 'direct', 5)
-       227±0.7μs          222±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'ffill', 'direct', 1)
-       256±0.5μs          251±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'bfill', 'direct', 5)
-         426±3μs          417±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct', 1)
-         414±3μs        405±0.8μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'sem', 'direct', 1)
-     2.68±0.03ms         2.62±0ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'pct_change', 'direct', 5)
-         418±2μs        408±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'sem', 'direct', 1)
-        1.10±0ms         1.07±0ms     0.98  groupby.FillNA.time_srs_ffill
-         262±1μs        256±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'bfill', 'direct', 5)
-     1.38±0.01ms         1.34±0ms     0.98  groupby.RankWithTies.time_rank_ties('float32', 'average')
-         234±2μs        228±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_field('uint', 'bfill', 'direct', 1)
-       255±0.9μs          248±1μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'ffill', 'direct', 5)
-       258±0.9μs          252±2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'tail', 'direct', 5)
-         428±3μs        417±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct', 1)
-         231±3μs        224±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'bfill', 'direct', 1)
-      21.1±0.1ms      20.5±0.06ms     0.97  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'direct', 1)
-     14.5±0.04ms      14.0±0.07ms     0.97  groupby.AggFunctions.time_different_numpy_functions
-     5.29±0.03ms      5.11±0.03ms     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'nunique', 'transformation', 5)
-      46.4±0.4ms       44.9±0.3ms     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 1)
-      96.7±0.3μs       93.4±0.2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'direct', 1)
-       267±0.7μs          257±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'tail', 'direct', 5)
-      98.1±0.5μs       94.5±0.4μs     0.96  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct', 1)
-      21.1±0.2ms      20.3±0.04ms     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'describe', 'direct', 1)
-         270±2μs          259±4μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct', 5)
-     36.2±0.09ms      34.8±0.08ms     0.96  groupby.GroupByMethods.time_dtype_as_group('uint', 'describe', 'direct', 1)
-     1.53±0.01ms      1.47±0.01ms     0.96  rolling.GroupbyEWM.time_groupby_method('var')
-        1.42±0ms      1.36±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'min')
-     1.40±0.04ms      1.34±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('float64', 'dense')
-      36.1±0.2ms       34.6±0.1ms     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 1)
-        1.42±0ms      1.36±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'max')
-     1.79±0.01ms      1.71±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'transformation', 5)
-     1.41±0.01ms      1.35±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'dense')
-     1.78±0.01ms      1.71±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'ffill', 'transformation', 5)
-     1.89±0.02ms      1.81±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'transformation', 5)
-         176±1μs        168±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_group('uint', 'head', 'direct', 5)
-     5.09±0.04ms      4.87±0.02ms     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'transformation', 5)
-         222±2ms        212±0.8ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 5)
-     1.43±0.01ms      1.36±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'shift', 'transformation', 5)
-     13.6±0.08ms      13.0±0.03ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'transformation', 1)
-         294±2ms          280±1ms     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 5)
-     10.9±0.06ms      10.4±0.03ms     0.95  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'transformation', 5)
-     9.45±0.04ms      9.02±0.04ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'direct', 5)
-         509±2μs          485±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('uint', 'sem', 'direct', 5)
-     9.33±0.07ms      8.89±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'transformation', 1)
-        1.45±0ms      1.38±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'transformation', 5)
-      20.4±0.2ms      19.4±0.08ms     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'direct', 1)
-      13.3±0.1ms      12.6±0.06ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'direct', 1)
-     1.55±0.02ms      1.47±0.01ms     0.95  rolling.GroupbyEWMEngine.time_groupby_mean('cython')
-     5.26±0.03ms      5.01±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'nunique', 'transformation', 5)
-     8.83±0.08ms      8.40±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'direct', 1)
-      14.7±0.2ms      14.0±0.03ms     0.95  groupby.AggFunctions.time_different_str_functions
-         223±1ms          212±1ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'describe', 'direct', 5)
-      13.7±0.1ms      13.0±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'transformation', 1)
-     4.31±0.03ms      4.09±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'nunique', 'transformation', 5)
-     1.70±0.01ms      1.61±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'ffill', 'transformation', 5)
-      16.1±0.3ms      15.2±0.07ms     0.95  groupby.Nth.time_frame_nth('float64')
-      9.70±0.1ms      9.19±0.04ms     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'transformation', 1)
-     1.45±0.01ms      1.38±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'transformation', 5)
-     1.13±0.02ms      1.07±0.01ms     0.95  groupby.FillNA.time_df_ffill
-     13.3±0.06ms      12.6±0.08ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'direct', 1)
-     1.71±0.01ms      1.61±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'transformation', 5)
-      8.92±0.1ms      8.42±0.04ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'direct', 1)
-     9.81±0.09ms      9.27±0.02ms     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'direct', 5)
-     5.30±0.01ms         5.00±0ms     0.94  groupby.GroupByMethods.time_dtype_as_group('int', 'nunique', 'transformation', 5)
-      9.41±0.1ms      8.88±0.03ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'transformation', 1)
-     9.58±0.09ms      9.03±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'direct', 5)
-     1.81±0.01ms      1.70±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'transformation', 5)
-      31.7±0.1ms       29.9±0.1ms     0.94  groupby.TransformEngine.time_series_cython(True)
-     1.68±0.01ms         1.58±0ms     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'transformation', 5)
-     1.71±0.02ms      1.62±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('uint', 'bfill', 'transformation', 5)
-      21.0±0.3ms       19.8±0.1ms     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'transformation', 1)
-     9.25±0.09ms       8.72±0.1ms     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'direct', 1)
-     1.57±0.01ms      1.48±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'transformation', 5)
-     1.56±0.01ms      1.47±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'transformation', 5)
-      31.7±0.3ms       29.8±0.2ms     0.94  groupby.TransformEngine.time_series_cython(False)
-     1.53±0.02ms      1.43±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation', 5)
-         210±1μs          197±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'tail', 'direct', 5)
-     1.16±0.02ms      1.08±0.01ms     0.94  groupby.FillNA.time_df_bfill
-         289±2ms          269±3ms     0.93  groupby.GroupByCythonAgg.time_frame_agg('float64', 'median')
-      33.0±0.2ms       30.6±0.2ms     0.93  groupby.TransformEngine.time_dataframe_cython(True)
-         128±1μs        119±0.7μs     0.93  groupby.GroupByMethods.time_dtype_as_field('uint', 'shift', 'direct', 5)
-     1.31±0.01ms      1.22±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'transformation', 5)
-     1.86±0.04ms      1.73±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('int', 'cumcount', 'transformation', 5)
-     1.47±0.01ms      1.36±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation', 5)
-         115±1μs          107±1μs     0.93  groupby.GroupByMethods.time_dtype_as_field('uint', 'shift', 'direct', 1)
-       123±0.9μs        114±0.5μs     0.93  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct', 5)
-     1.04±0.01ms          960±6μs     0.92  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'direct', 5)
-     1.07±0.01ms          994±5μs     0.92  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'direct', 5)
-     1.06±0.02ms          980±4μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'direct', 5)
-       108±0.7μs      100.0±0.4μs     0.92  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'direct', 1)
-      69.6±0.6ms       64.2±0.3ms     0.92  groupby.GroupByMethods.time_dtype_as_field('datetime', 'unique', 'direct', 1)
-     1.10±0.01ms      1.01±0.01ms     0.92  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumcount', 'direct', 5)
-       106±0.5μs       97.4±0.7μs     0.92  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'direct', 1)
-      38.6±0.2ms       35.5±0.4ms     0.92  groupby.GroupByMethods.time_dtype_as_field('uint', 'unique', 'direct', 1)
-       110±0.6μs        101±0.8μs     0.92  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct', 1)
-         696±9μs          638±5μs     0.92  groupby.Shift.time_fill_value
-     1.42±0.01ms      1.30±0.01ms     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'transformation', 5)
-         111±2μs        102±0.7μs     0.92  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct', 1)
-      38.7±0.3ms       35.4±0.1ms     0.92  groupby.GroupByMethods.time_dtype_as_field('int', 'unique', 'direct', 1)
-      56.7±0.3ms       51.9±0.7ms     0.92  groupby.GroupByMethods.time_dtype_as_group('uint', 'unique', 'direct', 1)
-      89.5±0.5ms       81.7±0.6ms     0.91  groupby.GroupByMethods.time_dtype_as_group('float', 'unique', 'direct', 1)
-         138±1μs          126±1μs     0.91  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 5)
-      93.1±0.4ms       84.9±0.4ms     0.91  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'direct', 1)
-      42.0±0.3ms       38.0±0.2ms     0.90  groupby.GroupByMethods.time_dtype_as_field('object', 'unique', 'direct', 1)
-      57.4±0.7ms       51.8±0.1ms     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'unique', 'direct', 1)
-      39.7±0.2ms       35.6±0.2ms     0.90  groupby.GroupByMethods.time_dtype_as_field('float', 'unique', 'direct', 1)
-      43.0±0.6ms       37.9±0.2ms     0.88  groupby.Sample.time_sample
-      50.9±0.2ms       44.8±0.5ms     0.88  groupby.Apply.time_scalar_function_multi_col(4)
-      17.8±0.1ms       15.6±0.1ms     0.88  groupby.Apply.time_scalar_function_single_col(4)
-         281±4ms        241±0.9ms     0.86  groupby.MultiColumn.time_lambda_sum
-         150±2ms          127±1ms     0.85  groupby.MultiColumn.time_col_select_lambda_sum
-       158±0.9ms       90.4±0.7ms     0.57  groupby.Apply.time_copy_overhead_single_col(4)
-         409±2ms        230±0.9ms     0.56  groupby.Apply.time_copy_function_multi_col(4)
  • The groupby.GroupManyLabels.time_sum(1000) case is ~13x slower. This is a case of a small but wide dataframe (shape of 1000x1000), and it's per-column overhead of checking dtypes etc in BaseGrouper._cython_operation and _call_cython_op. PERF: reducing dtype checking overhead in groupby #44738 shows that this overhead can be reduced a bit.
    Also worth noting that if you go from (1000, 1000) to (10,000, 100), the overhead reduces to a 3x slowdown (on current master), and with another 10x more rows, to a 2x slowdown.

  • I can't reproduce the differences in GroupByMethods.time_dtype_as_group in an interactive python session with %timeit. For example the groupby cumsum() with 5 columns would show a 3x slowdown, but interactively this is within 10% of each other. I didn't yet figure out why we see those slowdowns (for some cases, speedups for others) through ASV.
    (while looking into this, I also noticed that the actual group_cumsum cython algo is only 1-2% of the overall time (for both ArrayManager and BlockManager), so those GroupByMethods benchmarks, due to the size of the dataframe / number of groups, is mostly benchmarking the factorize step of groupby, which is the same for each of the groupby methods)

  • Note that there can be in general some room for small speed-up if we simplify our groupby algos for 1D arrays, see the discussion in [POC] PERF: 1d version of the cython grouped aggregation algorithms #39861

Reductions (stat_ops)

$ asv continuous -f 1.01 -b stat_ops HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+     4.30±0.03ms          187±2ms    43.44  stat_ops.Correlation.time_corrwith_rows('pearson')
+         616±9μs      3.18±0.02ms     5.16  stat_ops.FrameOps.time_op('prod', 'int', 1)
+         590±4μs      2.92±0.01ms     4.94  stat_ops.FrameOps.time_op('sum', 'int', 1)
+     1.67±0.01ms      6.25±0.02ms     3.74  stat_ops.FrameOps.time_op('sum', 'float', 1)
+     3.91±0.01ms      9.27±0.07ms     2.37  stat_ops.Correlation.time_corrwith_cols('pearson')
+         975±4μs      2.06±0.01ms     2.11  stat_ops.FrameOps.time_op('mean', 'int', 1)
+     1.09±0.01ms      2.17±0.02ms     1.98  stat_ops.FrameOps.time_op('mean', 'float', 1)
+     9.77±0.03ms      17.6±0.07ms     1.81  stat_ops.FrameOps.time_op('kurt', 'int', 1)
+     11.4±0.09ms      19.8±0.04ms     1.73  stat_ops.FrameOps.time_op('skew', 'int', 1)
+     3.86±0.05ms      6.63±0.08ms     1.72  stat_ops.FrameOps.time_op('mad', 'int', 1)
+     1.43±0.01ms      2.46±0.01ms     1.71  stat_ops.FrameOps.time_op('var', 'int', 1)
+     1.57±0.01ms      2.61±0.02ms     1.67  stat_ops.FrameOps.time_op('var', 'float', 1)
+     1.71±0.01ms      2.73±0.02ms     1.60  stat_ops.FrameOps.time_op('std', 'int', 1)
+     4.65±0.06ms      7.36±0.04ms     1.58  stat_ops.FrameOps.time_op('sem', 'float', 1)
+     4.05±0.03ms         6.28±0ms     1.55  stat_ops.FrameOps.time_op('prod', 'float', 1)
+     1.93±0.01ms      2.97±0.02ms     1.54  stat_ops.FrameOps.time_op('std', 'float', 1)
+     5.56±0.02ms      8.43±0.02ms     1.52  stat_ops.FrameMultiIndexOps.time_op(0, 'std')
+     5.68±0.06ms      8.57±0.04ms     1.51  stat_ops.FrameMultiIndexOps.time_op(0, 'var')
+     5.76±0.02ms      8.48±0.05ms     1.47  stat_ops.FrameMultiIndexOps.time_op(1, 'var')
+         518±1ms          761±4ms     1.47  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'skew')
+     5.71±0.06ms      8.37±0.08ms     1.47  stat_ops.FrameMultiIndexOps.time_op(1, 'std')
+      4.45±0.2ms       6.53±0.1ms     1.46  stat_ops.FrameOps.time_op('mad', 'float', 1)
+       240±0.4μs          333±2μs     1.39  stat_ops.Correlation.time_corr('pearson')
+     5.66±0.03ms      7.69±0.04ms     1.36  stat_ops.FrameMultiIndexOps.time_op(0, 'mean')
+     5.70±0.01ms      7.67±0.01ms     1.35  stat_ops.FrameMultiIndexOps.time_op(0, 'sum')
+      66.7±0.5ms         88.5±1ms     1.33  stat_ops.FrameMultiIndexOps.time_op(1, 'skew')
+     5.83±0.03ms      7.70±0.06ms     1.32  stat_ops.FrameMultiIndexOps.time_op(1, 'sum')
+     5.81±0.03ms      7.62±0.03ms     1.31  stat_ops.FrameMultiIndexOps.time_op(1, 'mean')
+     3.71±0.03ms      4.79±0.06ms     1.29  stat_ops.FrameOps.time_op('sem', 'int', 1)
+     3.82±0.01ms      4.81±0.02ms     1.26  stat_ops.FrameOps.time_op('median', 'int', 1)
+      9.02±0.1ms      11.3±0.03ms     1.26  stat_ops.FrameMultiIndexOps.time_op(1, 'sem')
+     9.19±0.04ms      11.5±0.03ms     1.25  stat_ops.FrameMultiIndexOps.time_op(0, 'sem')
+     4.59±0.02ms      5.65±0.02ms     1.23  stat_ops.FrameOps.time_op('median', 'float', 1)
+         978±8ms          1.20±0s     1.23  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'mad')
+     4.10±0.01ms       4.96±0.1ms     1.21  stat_ops.Correlation.time_corr_wide('pearson')
+      9.87±0.3ms       11.9±0.3ms     1.21  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'std')
+      10.0±0.2ms       12.1±0.3ms     1.21  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'var')
+     5.18±0.04ms      6.21±0.04ms     1.20  stat_ops.FrameMultiIndexOps.time_op(0, 'prod')
+       112±0.8ms        133±0.7ms     1.19  stat_ops.FrameMultiIndexOps.time_op(1, 'mad')
+     5.17±0.03ms      6.15±0.03ms     1.19  stat_ops.FrameMultiIndexOps.time_op(1, 'prod')
+     3.64±0.04ms      4.27±0.02ms     1.17  stat_ops.FrameOps.time_op('mad', 'int', 0)
+     13.2±0.04ms       15.2±0.2ms     1.14  stat_ops.Rank.time_rank('DataFrame', True)
+     15.8±0.01ms      18.0±0.06ms     1.14  stat_ops.Correlation.time_corr_wide_nans('pearson')
+     13.1±0.05ms       14.8±0.2ms     1.13  stat_ops.Rank.time_rank('DataFrame', False)
+     13.3±0.03ms       15.1±0.2ms     1.13  stat_ops.Rank.time_average_old('DataFrame', False)
+     13.5±0.03ms       15.2±0.2ms     1.12  stat_ops.Rank.time_average_old('DataFrame', True)
+        753±10μs         841±10μs     1.12  stat_ops.FrameOps.time_op('sum', 'int', 0)
+         973±6μs         1.08±0ms     1.11  stat_ops.FrameOps.time_op('mean', 'int', 0)
+         983±4μs         1.08±0ms     1.10  stat_ops.FrameOps.time_op('mean', 'float', 0)
+        1.15±0ms      1.27±0.01ms     1.10  stat_ops.Correlation.time_corr('spearman')
+      14.0±0.2ms      15.1±0.04ms     1.08  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'sem')
+     2.91±0.01ms      3.13±0.01ms     1.07  stat_ops.FrameOps.time_op('skew', 'int', 0)
+     4.01±0.01ms      4.30±0.01ms     1.07  stat_ops.FrameOps.time_op('kurt', 'float', 0)
+     22.0±0.09ms       23.6±0.3ms     1.07  stat_ops.FrameMultiIndexOps.time_op(0, 'mad')
+     4.17±0.01ms      4.45±0.01ms     1.07  stat_ops.FrameOps.time_op('skew', 'float', 0)
+     2.78±0.02ms      2.96±0.01ms     1.06  stat_ops.FrameOps.time_op('kurt', 'int', 0)
+        1.64±0ms      1.73±0.01ms     1.06  stat_ops.FrameOps.time_op('var', 'int', 0)
+     1.65±0.01ms      1.73±0.01ms     1.05  stat_ops.FrameOps.time_op('var', 'float', 0)
+        1.68±0ms      1.74±0.01ms     1.04  stat_ops.FrameOps.time_op('prod', 'float', 0)
+     3.50±0.02ms      3.60±0.02ms     1.03  stat_ops.FrameOps.time_op('sem', 'int', 0)
+     3.84±0.02ms      3.93±0.02ms     1.02  stat_ops.FrameOps.time_op('sem', 'float', 0)
-      22.0±0.2ms      21.3±0.09ms     0.97  stat_ops.SeriesMultiIndexOps.time_op(1, 'skew')
-         150±1ms        145±0.9ms     0.97  stat_ops.SeriesMultiIndexOps.time_op([0, 1], 'kurt')
-     1.29±0.01ms         1.24±0ms     0.97  stat_ops.FrameOps.time_op('prod', 'Int64', 0)
-        1.13±0ms      1.09±0.01ms     0.96  stat_ops.FrameOps.time_op('sum', 'Int64', 0)
-         575±2ms          548±4ms     0.95  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'kurt')
-       148±0.7ms        141±0.7ms     0.95  stat_ops.SeriesMultiIndexOps.time_op([0, 1], 'skew')
-        36.4±1ms      34.7±0.05ms     0.95  stat_ops.FrameOps.time_op('sum', 'Int64', 1)
-        39.1±1ms       37.2±0.2ms     0.95  stat_ops.FrameOps.time_op('mean', 'Int64', 1)
-     1.24±0.01ms      1.18±0.01ms     0.95  stat_ops.FrameOps.time_op('mean', 'Int64', 0)
-      20.2±0.1ms       19.1±0.1ms     0.94  stat_ops.FrameMultiIndexOps.time_op(0, 'skew')
-        59.4±1ms       55.5±0.2ms     0.93  stat_ops.FrameOps.time_op('skew', 'Int64', 1)
-      77.9±0.4ms       72.4±0.5ms     0.93  stat_ops.FrameMultiIndexOps.time_op(1, 'kurt')
-     25.8±0.05ms      23.6±0.05ms     0.92  stat_ops.FrameMultiIndexOps.time_op(0, 'kurt')
-        39.3±1ms      35.5±0.06ms     0.90  stat_ops.FrameOps.time_op('prod', 'Int64', 1)
  • DataFrame.corrwith(..., method="pearson", axis=1) is a lot slower:

    • for "pearson" we have custom code that operates on the datafame itself (a couple of arithmetic operations) -> those have currently a higher overhead with ArrayManager
    • this overhead is especially visible with axis=1, because then we transpose the dataframe, and get a (15, 500) shape

    But in general, this is a tiny but wide dataframe, so where the fixed overhead is significant. If I increase the size of the dataset, both have more or less the same performance.

  • Reductions with axis=1 (so taking eg the mean of each row, instead of each column) are slower, as can be expected (since this needs to go through a transpose / conversion to numpy array).

  • For the rest, column-wise reductions are more or less the same for ArrayManager vs BlockManager on those benchmarks (some a bit faster, some a bit slower)

Element-wise ops (arithmetic)

$ asv continuous -f 1.01 -b arithmetic HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks~1>       <am-benchmarks>
+     6.10±0.04ms         87.1±2ms    14.28  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000, 10000))
+     9.92±0.05ms        106±0.5ms    10.67  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000, 10000))
+         416±5μs       4.32±0.4ms    10.37  arithmetic.Ops2.time_frame_series_dot
+     12.9±0.03ms        119±0.6ms     9.16  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (1000, 10000))
+     1.15±0.03ms      9.37±0.09ms     8.15  arithmetic.Ops2.time_frame_float_div_by_zero
+     35.6±0.07ms          285±3ms     8.01  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000, 10000))
+     1.52±0.04ms      11.7±0.08ms     7.73  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('eq')
+     1.52±0.04ms      11.6±0.04ms     7.60  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ne')
+     1.54±0.05ms       11.7±0.1ms     7.58  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('gt')
+     1.54±0.04ms      11.6±0.05ms     7.51  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('le')
+     1.56±0.05ms       11.7±0.1ms     7.46  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ge')
+     1.56±0.06ms      11.6±0.05ms     7.43  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('lt')
+     1.82±0.01ms      10.5±0.07ms     5.78  arithmetic.Ops2.time_frame_int_div_by_zero
+     13.6±0.06ms       77.6±0.8ms     5.72  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (1000, 10000))
+     1.79±0.01ms      8.77±0.04ms     4.91  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('add')
+     1.83±0.03ms      8.81±0.03ms     4.83  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('sub')
+     20.5±0.08ms       96.0±0.4ms     4.68  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('pow')
+     2.82±0.02ms      13.2±0.07ms     4.67  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('truediv')
+     1.99±0.02ms      8.93±0.03ms     4.49  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('mul')
+        19.4±7ms       60.6±0.3ms     3.12  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000, 10000))
+      5.54±0.5ms       15.7±0.1ms     2.84  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('truediv')
+     9.77±0.07ms       27.0±0.4ms     2.76  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (10000, 1000))
+      5.42±0.5ms       14.2±0.1ms     2.61  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('sub')
+      5.45±0.5ms      14.1±0.08ms     2.59  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('mul')
+     5.86±0.09ms       15.0±0.3ms     2.56  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (10000, 1000))
+     30.4±0.08ms       76.8±0.9ms     2.53  arithmetic.Ops2.time_frame_float_floor_by_zero
+        9.50±1ms         22.3±1ms     2.35  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('eq')
+        9.52±1ms         22.2±2ms     2.34  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ne')
+        9.49±1ms         22.1±2ms     2.33  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('le')
+        9.50±1ms         22.0±2ms     2.32  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('lt')
+        9.55±1ms         22.1±2ms     2.32  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ge')
+        9.56±1ms         22.0±2ms     2.30  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('gt')
+     1.79±0.01ms       4.11±0.2ms     2.30  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function le>)
+        1.81±0ms       4.13±0.2ms     2.28  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ge>)
+     1.78±0.03ms       4.00±0.2ms     2.25  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ge>)
+     1.28±0.01ms       2.85±0.2ms     2.23  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function lt>)
+     1.28±0.02ms       2.84±0.3ms     2.23  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function le>)
+     1.81±0.02ms       3.99±0.2ms     2.21  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function le>)
+        6.41±1ms       14.1±0.1ms     2.20  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('add')
+     1.90±0.01ms       4.15±0.1ms     2.18  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function eq>)
+     1.90±0.04ms       4.13±0.2ms     2.18  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function gt>)
+     1.93±0.03ms       4.14±0.2ms     2.15  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function lt>)
+        21.6±3ms       46.1±0.5ms     2.14  arithmetic.Ops.time_frame_multi_and(True, 'default')
+     1.28±0.01ms       2.74±0.2ms     2.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ge>)
+     1.88±0.01ms       3.99±0.2ms     2.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function eq>)
+     1.27±0.01ms       2.69±0.2ms     2.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function gt>)
+     1.88±0.02ms       3.97±0.2ms     2.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function gt>)
+     1.89±0.02ms       3.96±0.2ms     2.09  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function lt>)
+     2.43±0.02ms      5.04±0.09ms     2.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mul>)
+     1.26±0.02ms       2.60±0.1ms     2.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ne>)
+     2.42±0.01ms       4.96±0.5ms     2.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function add>)
+     2.02±0.02ms       4.14±0.2ms     2.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ne>)
+     2.81±0.01ms       5.73±0.1ms     2.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function truediv>)
+     2.42±0.01ms      4.91±0.06ms     2.02  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mul>)
+        2.42±0ms      4.85±0.06ms     2.00  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function add>)
+     2.02±0.02ms       4.03±0.2ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ne>)
+     1.36±0.01ms      2.70±0.08ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function le>)
+     13.5±0.04ms       26.8±0.2ms     1.98  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (10000, 1000))
+     1.37±0.01ms      2.70±0.08ms     1.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ge>)
+     2.92±0.07ms      5.78±0.07ms     1.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function truediv>)
+     1.27±0.01ms      2.51±0.02ms     1.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function eq>)
+     2.78±0.02ms      5.45±0.07ms     1.96  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function truediv>)
+     2.42±0.01ms      4.73±0.07ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function sub>)
+     2.42±0.01ms       4.71±0.2ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function sub>)
+     1.35±0.01ms       2.58±0.1ms     1.91  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ge>)
+        1.35±0ms       2.57±0.2ms     1.89  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function le>)
+      33.4±0.7ms       62.6±0.8ms     1.88  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('floordiv')
+     12.7±0.01ms      23.8±0.09ms     1.87  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (10000, 1000))
+        1.45±0ms      2.69±0.09ms     1.86  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function gt>)
+        1.45±0ms       2.68±0.1ms     1.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function eq>)
+     1.46±0.01ms      2.70±0.07ms     1.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function lt>)
+     1.43±0.01ms       2.60±0.1ms     1.81  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function gt>)
+     1.44±0.02ms       2.57±0.1ms     1.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function eq>)
+     35.7±0.09ms       63.3±0.4ms     1.77  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (10000, 1000))
+     1.44±0.01ms       2.56±0.1ms     1.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function lt>)
+     1.96±0.03ms      3.44±0.04ms     1.75  arithmetic.Ops.time_frame_comparison(True, 'default')
+        26.2±2ms       45.6±0.6ms     1.74  arithmetic.Ops.time_frame_multi_and(False, 'default')
+        26.5±2ms       46.0±0.2ms     1.74  arithmetic.Ops.time_frame_multi_and(False, 1)
+     1.57±0.01ms      2.72±0.06ms     1.73  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ne>)
+      20.9±0.1ms       35.8±0.5ms     1.71  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function pow>)
+     20.9±0.03ms       35.7±0.2ms     1.71  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function pow>)
+     3.27±0.06ms       5.49±0.1ms     1.68  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function truediv>)
+     2.03±0.04ms      3.39±0.04ms     1.67  arithmetic.Ops.time_frame_comparison(False, 'default')
+     2.03±0.02ms      3.39±0.03ms     1.67  arithmetic.Ops.time_frame_comparison(False, 1)
+     1.70±0.01ms      2.83±0.07ms     1.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function le>)
+     1.71±0.01ms       2.85±0.1ms     1.66  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function gt>)
+     1.71±0.01ms       2.83±0.1ms     1.66  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function lt>)
+        28.2±2ms       46.2±0.5ms     1.64  arithmetic.Ops.time_frame_multi_and(True, 1)
+        1.56±0ms       2.55±0.1ms     1.63  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ne>)
+     1.72±0.01ms      2.80±0.09ms     1.63  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ge>)
+      11.1±0.1ms         18.0±3ms     1.62  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (100000, 100))
+     1.71±0.02ms       2.75±0.1ms     1.61  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function eq>)
+     1.71±0.01ms       2.73±0.1ms     1.59  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ne>)
+     1.70±0.01ms       2.66±0.1ms     1.56  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function le>)
+     1.70±0.01ms       2.63±0.1ms     1.55  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ge>)
+     1.79±0.02ms      2.75±0.07ms     1.54  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function le>)
+     2.45±0.02ms      3.73±0.07ms     1.53  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function truediv>)
+     1.81±0.01ms      2.75±0.06ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ge>)
+     2.36±0.01ms      3.59±0.05ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mul>)
+     2.43±0.02ms      3.65±0.06ms     1.50  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function truediv>)
+      27.6±0.6ms      40.6±0.05ms     1.47  arithmetic.Ops2.time_frame_dot
+     9.86±0.07ms       14.5±0.3ms     1.47  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000000, 10))
+     2.36±0.02ms      3.46±0.03ms     1.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mul>)
+     2.36±0.01ms      3.45±0.06ms     1.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function add>)
+     1.90±0.02ms      2.78±0.08ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function gt>)
+     2.36±0.02ms      3.45±0.03ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function pow>)
+     2.36±0.01ms      3.44±0.02ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function sub>)
+     2.34±0.01ms      3.41±0.04ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function add>)
+     2.36±0.01ms      3.44±0.06ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function sub>)
+     2.42±0.01ms      3.51±0.07ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function truediv>)
+     1.90±0.01ms      2.76±0.08ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function eq>)
+     1.88±0.02ms      2.73±0.07ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function lt>)
+     1.85±0.01ms       2.66±0.1ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function gt>)
+     1.85±0.01ms       2.63±0.1ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function eq>)
+     1.85±0.02ms       2.61±0.1ms     1.41  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function lt>)
+        26.2±1ms       37.0±0.4ms     1.41  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('pow')
+     2.36±0.01ms      3.32±0.05ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mul>)
+     2.37±0.01ms      3.32±0.03ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mul>)
+     2.37±0.01ms      3.32±0.04ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function sub>)
+     2.37±0.02ms      3.30±0.04ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function sub>)
+     2.60±0.03ms      3.62±0.04ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function truediv>)
+     2.36±0.01ms      3.28±0.06ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mul>)
+     2.38±0.02ms      3.29±0.03ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function sub>)
+     2.37±0.01ms      3.26±0.04ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function add>)
+     2.00±0.02ms      2.76±0.09ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ne>)
+     2.36±0.01ms      3.25±0.04ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function add>)
+     2.38±0.01ms      3.26±0.03ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function add>)
+     2.38±0.01ms      3.25±0.04ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mul>)
+     1.97±0.02ms       2.64±0.1ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ne>)
+     41.8±0.03ms       56.0±0.7ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function pow>)
+     41.6±0.05ms       55.7±0.3ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function pow>)
+     41.7±0.02ms       55.7±0.3ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function pow>)
+     2.91±0.02ms      3.88±0.05ms     1.33  arithmetic.Ops.time_frame_add(False, 'default')
+     2.37±0.02ms      3.14±0.05ms     1.32  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function sub>)
+      2.92±0.2ms      3.85±0.03ms     1.32  arithmetic.Ops.time_frame_mult(False, 'default')
+      37.3±0.4ms       49.0±0.1ms     1.31  arithmetic.Ops2.time_frame_float_div
+     2.37±0.02ms      3.10±0.04ms     1.31  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function add>)
+     2.95±0.03ms      3.84±0.05ms     1.30  arithmetic.Ops.time_frame_mult(False, 1)
+      2.98±0.1ms      3.87±0.03ms     1.30  arithmetic.Ops.time_frame_add(False, 1)
+     10.8±0.06ms       13.6±0.3ms     1.26  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function pow>)
+      32.3±0.2ms      39.2±0.08ms     1.21  arithmetic.Ops2.time_frame_float_mod
+     3.31±0.02ms      3.98±0.03ms     1.20  arithmetic.Ops.time_frame_add(True, 1)
+     2.96±0.03ms      3.48±0.03ms     1.18  arithmetic.Ops.time_frame_comparison(True, 1)
+     30.4±0.02ms       34.5±0.3ms     1.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function floordiv>)
+      30.3±0.1ms       34.5±0.3ms     1.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function floordiv>)
+     33.2±0.03ms       37.7±0.2ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function floordiv>)
+     33.1±0.06ms       37.4±0.3ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mod>)
+     33.3±0.05ms       37.6±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function floordiv>)
+      33.3±0.1ms       37.5±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function floordiv>)
+     32.2±0.05ms       36.3±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mod>)
+      33.4±0.1ms       37.5±0.3ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function floordiv>)
+      29.1±0.2ms       32.6±0.2ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mod>)
+     32.4±0.07ms       36.1±0.3ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function floordiv>)
+     29.1±0.05ms       32.4±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mod>)
+     30.3±0.04ms       33.7±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mod>)
+      28.9±0.6ms       32.1±0.2ms     1.11  arithmetic.Ops2.time_frame_int_mod
+     28.2±0.07ms       31.2±0.1ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mod>)
+     28.1±0.02ms       31.1±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mod>)
+     28.3±0.07ms       31.2±0.3ms     1.10  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mod>)
+     12.7±0.05ms      13.7±0.09ms     1.08  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (100000, 100))
+     35.6±0.03ms      38.2±0.07ms     1.07  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (100000, 100))
-     35.5±0.04ms      35.1±0.05ms     0.99  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000000, 10))
-        463±20μs          426±4μs     0.92  arithmetic.NumericInferOps.time_multiply(<class 'numpy.uint32'>)
-        469±20μs          421±5μs     0.90  arithmetic.NumericInferOps.time_add(<class 'numpy.int32'>)
-      9.40±0.5ms      8.28±0.06ms     0.88  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000000, 10))
-     42.2±0.07ms      3.40±0.03ms     0.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function pow>)

In general the element-wise ops are probably that set of operations that can see the biggest impact of performing column-by-column instead of on a single block:

  • dot() is slower, but since that's basically a 2D array operation, that's to be expected.

  • The biggest slowdown is seen in the FrameWithFrameWide class. However, many of the cases actually don't show up in the above output (so meaning that they didn't give a significant difference), and the ones that do show up with the biggest slowdown are the cases with shape (1000, 10000), so very wide dataframes. For wide dataframes, some slowdown will be inevitable (question is of course how much we find acceptable).
    Similarly, the next set of benchmarks that show the biggest slowdown is for the MixedFrameWithSeriesAxis class, which is using a DataFrame of shape (1000, 1000), i.e. also a wide DataFrame. When changing the shape to (10,000, 100) the difference already reduces from a 7x slowdown to 2x, for the slowest case.

  • For the wide dataframes, the main issue is the per-column overhead (checking dtypes, checking wich array op should be used, ...). I think there is quite some room for improvement to reduce this per-column overhead for those operations to specifically improve the wide dataframe case. Some examples:

    • Currently, the functions in array_ops.py involve a lot of array type checking (should_extension_dispatch), dtype checking, validating of the right operand, etc that can be optimized or moved upwards.
      For example, in the FrameWithFrameWide case of summing two dataframes (df + df), the actual summing (the numpy operation) takes only around 20% of the overall time, while should_extension_dispatch and dispatch_fill_zeros together already take more time than that (both functions called in the arithmetic_op array op function, where should_extension_dispatch is mainly slow because of using ABC check, and dispatch_fill_zeros is actually a no-op for addition, so should never be called)

    • In the step before the array op (_dispatch_frame_op), we could avoiding broadcasting Series to DataFrame as explored in REF: avoid broadcasting of Series to DataFrame in ops for ArrayManager #40482, which improves the time_frame_op_with_series_axis0/1 cases (eg frame + series) quite a bit.

  • One note about the IntFrameWithScalar.time_frame_op_with_scalar: those have such a shape of DataFrame, that the BlockManager version is using numexpr, and the ArrayManager version not (because the minimum number per elements has to be reached here per column, and not per block). It seems that the cases that are ~2x slower for ArrayManager, are mostly comparison operations, and apparently numexpr is quite a bit faster for those ops compared to numpy, and so the difference in those benchmarks is mostly showing the effect of numexpr. It might be worth investigating if we should reduce the minimum of elements specifically for those operations, but also worth noting that when using a larger dataframe, also the ArrayManager case will start using numexpr.

The remainder

$ asv continuous -f 1.01 HEAD~1 HEAD with the above entries removed
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks2~1>       <am-benchmarks2>
+        6.71±1ms         75.1±4ms    11.20  eval.Eval.time_add('numexpr', 'all')
+        6.74±1ms         72.8±5ms    10.79  eval.Eval.time_mult('numexpr', 'all')
+      11.3±0.2ms         96.3±2ms     8.49  eval.Eval.time_chained_cmp('numexpr', 'all')
+      9.06±0.6ms         73.5±5ms     8.11  eval.Eval.time_mult('numexpr', 1)
+      9.01±0.6ms         73.1±5ms     8.11  eval.Eval.time_add('numexpr', 1)
+        414±20μs       2.72±0.2ms     6.56  rolling.TableMethod.time_apply('table')
+      14.6±0.7ms         65.9±1ms     4.52  eval.Eval.time_and('numexpr', 'all')
+      25.3±0.2ms        111±0.7ms     4.38  eval.Eval.time_chained_cmp('numexpr', 1)
+      15.9±0.1μs       45.2±0.4μs     2.85  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'int'>)
+      16.1±0.1μs       45.7±0.2μs     2.84  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'float'>)
+      15.9±0.2μs       45.1±0.4μs     2.84  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'int'>)
+      16.0±0.1μs       45.4±0.4μs     2.84  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'float'>)
+     16.0±0.02μs       45.4±0.4μs     2.83  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'float'>)
+      16.0±0.2μs       45.2±0.4μs     2.82  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'int'>)
+      11.0±0.7ms       29.5±0.5ms     2.69  io.hdf.HDFStoreDataFrame.time_read_store_table_wide
+     15.7±0.09μs       41.5±0.2μs     2.65  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'int'>)
+      15.8±0.1μs       41.6±0.4μs     2.64  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'float'>)
+     33.1±0.07ms       84.4±0.8ms     2.55  eval.Eval.time_and('numexpr', 1)
+     23.1±0.09μs       52.4±0.4μs     2.26  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'bool'>)
+     23.1±0.08μs       52.3±0.3μs     2.26  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'bool'>)
+      23.4±0.2μs       52.4±0.2μs     2.24  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'bool'>)
+      23.5±0.2μs       52.5±0.4μs     2.24  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'complex'>)
+      23.5±0.1μs       52.5±0.3μs     2.23  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'complex'>)
+     23.5±0.09μs       52.5±0.1μs     2.23  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'complex'>)
+     23.6±0.07μs       52.6±0.2μs     2.23  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'complex'>)
+      26.3±0.1μs       56.3±0.4μs     2.14  dtypes.SelectDtypes.time_select_dtype_string_include('Int8')
+      26.5±0.1μs       56.0±0.3μs     2.11  dtypes.SelectDtypes.time_select_dtype_float_include('Int8')
+      26.6±0.1μs       55.9±0.2μs     2.10  dtypes.SelectDtypes.time_select_dtype_int_include('Int8')
+      26.7±0.1μs       56.1±0.4μs     2.10  dtypes.SelectDtypes.time_select_dtype_bool_include('Int8')
+      23.3±0.2μs       48.7±0.1μs     2.09  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'bool'>)
+      27.3±0.3μs       57.1±0.3μs     2.09  dtypes.SelectDtypes.time_select_dtype_float_include('Int16')
+      27.2±0.2μs       56.8±0.3μs     2.09  dtypes.SelectDtypes.time_select_dtype_string_include('Int16')
+      27.3±0.2μs       56.7±0.3μs     2.08  dtypes.SelectDtypes.time_select_dtype_bool_include('Int16')
+      27.4±0.3μs       56.8±0.2μs     2.07  dtypes.SelectDtypes.time_select_dtype_int_include('Int16')
+      27.9±0.1μs       57.5±0.3μs     2.06  dtypes.SelectDtypes.time_select_dtype_int_include('Int32')
+      28.0±0.1μs       57.6±0.2μs     2.06  dtypes.SelectDtypes.time_select_dtype_float_include('Int32')
+      28.0±0.2μs       57.6±0.1μs     2.05  dtypes.SelectDtypes.time_select_dtype_string_include('Int32')
+      28.1±0.3μs       57.5±0.3μs     2.05  dtypes.SelectDtypes.time_select_dtype_bool_include('Int32')
+      28.8±0.4μs       58.7±0.5μs     2.04  dtypes.SelectDtypes.time_select_dtype_string_include('Int64')
+      28.9±0.4μs       58.8±0.4μs     2.03  dtypes.SelectDtypes.time_select_dtype_float_include('Int64')
+      28.8±0.4μs       58.5±0.3μs     2.03  dtypes.SelectDtypes.time_select_dtype_bool_include('Int64')
+      29.2±0.2μs       59.3±0.5μs     2.03  dtypes.SelectDtypes.time_select_dtype_int_include('UInt8')
+      29.7±0.1μs       60.0±0.6μs     2.02  dtypes.SelectDtypes.time_select_dtype_int_include('UInt16')
+      29.5±0.1μs       59.3±0.6μs     2.01  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt8')
+      29.9±0.1μs       60.0±0.3μs     2.01  dtypes.SelectDtypes.time_select_dtype_string_include('UInt16')
+      29.5±0.2μs       59.3±0.3μs     2.01  dtypes.SelectDtypes.time_select_dtype_float_include('UInt8')
+      29.6±0.2μs       59.1±0.2μs     2.00  dtypes.SelectDtypes.time_select_dtype_string_include('UInt8')
+      29.9±0.2μs       59.8±0.2μs     2.00  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt16')
+      29.9±0.1μs       59.7±0.3μs     2.00  dtypes.SelectDtypes.time_select_dtype_float_include('UInt16')
+      30.4±0.2μs       60.5±0.3μs     1.99  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt32')
+      30.5±0.1μs       60.6±0.2μs     1.99  dtypes.SelectDtypes.time_select_dtype_string_include('UInt32')
+      30.7±0.2μs       60.7±0.3μs     1.98  dtypes.SelectDtypes.time_select_dtype_int_include('UInt32')
+     31.0±0.08μs       61.2±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_int_include('UInt64')
+      31.1±0.1μs       61.3±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_string_include('UInt64')
+      30.7±0.1μs       60.5±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_float_include('UInt32')
+     31.3±0.09μs       61.4±0.2μs     1.96  dtypes.SelectDtypes.time_select_dtype_float_include('UInt64')
+      31.4±0.2μs       61.6±0.5μs     1.96  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt64')
+     4.56±0.05ms         8.86±3ms     1.94  gil.ParallelRolling.time_rolling('min')
+      28.5±0.3μs       54.8±0.3μs     1.92  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int64')
+       212±0.7ns          389±4ns     1.84  attrs_caching.DataFrameAttributes.time_get_index
+     6.39±0.08ms      11.6±0.03ms     1.81  timeseries.AsOf.time_asof_nan('DataFrame')
+     6.60±0.06ms      11.8±0.02ms     1.78  timeseries.AsOf.time_asof('DataFrame')
+      40.1±0.3μs         71.4±2μs     1.78  dtypes.SelectDtypes.time_select_dtype_int_include('int8')
+      40.4±0.2μs         71.6±2μs     1.77  dtypes.SelectDtypes.time_select_dtype_int_include('int16')
+      39.8±0.2μs       70.1±0.2μs     1.76  dtypes.SelectDtypes.time_select_dtype_string_include('m8[ns]')
+     39.9±0.02μs       70.1±0.6μs     1.76  dtypes.SelectDtypes.time_select_dtype_string_include('M8[ns]')
+      40.0±0.2μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('m8[ns]')
+      40.0±0.3μs       70.2±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('M8[ns]')
+     40.1±0.08μs       70.3±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint16')
+     39.9±0.08μs       69.9±0.1μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('m8[ns]')
+      40.1±0.2μs       70.3±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('uint16')
+      40.0±0.2μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint64')
+      39.9±0.1μs       70.0±0.2μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('M8[ns]')
+      40.1±0.1μs       70.2±0.9μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('float64')
+      39.8±0.2μs       69.7±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int8')
+      40.1±0.4μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('m8[ns]')
+      40.2±0.1μs       70.2±0.6μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('complex64')
+      40.0±0.2μs      69.8±0.09μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('float32')
+      39.9±0.3μs       69.7±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('bool')
+      40.6±0.1μs       70.8±0.1μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('timedelta64[ns]')
+      40.1±0.1μs       70.0±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('M8[ns]')
+      40.3±0.2μs       70.3±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint32')
+      40.1±0.2μs       70.1±0.2μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int32')
+      40.0±0.1μs       69.9±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('int32')
+      40.2±0.2μs       70.1±0.4μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('uint16')
+      40.0±0.2μs       69.9±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('complex128')
+     40.2±0.06μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int64')
+      40.0±0.2μs       69.8±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('complex64')
+      40.1±0.3μs       69.9±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('uint8')
+      40.0±0.1μs       69.8±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_int_include('complex128')
+      40.1±0.5μs       70.0±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('uint8')
+      40.1±0.1μs       69.9±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('int64')
+      40.2±0.1μs       70.1±0.1μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('float32')
+      40.1±0.1μs       69.9±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int64')
+      40.2±0.2μs       70.0±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('complex64')
+      40.2±0.3μs       70.2±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int32')
+      40.7±0.2μs       70.9±0.1μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('timedelta64[ns]')
+     40.0±0.09μs       69.7±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('float32')
+      39.9±0.1μs       69.5±0.4μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('bool')
+      40.2±0.2μs       69.9±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('float64')
+     40.1±0.06μs       69.8±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('complex128')
+      40.7±0.2μs       70.8±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('timedelta64[ns]')
+      40.4±0.3μs       70.2±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('float32')
+      40.2±0.2μs       69.8±0.7μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('uint64')
+      40.2±0.1μs       69.8±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int8')
+      40.1±0.1μs       69.7±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('float64')
+      40.3±0.2μs       69.9±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_int_include('uint32')
+      40.2±0.1μs       69.8±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('uint16')
+     39.9±0.07μs       69.3±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('bool')
+      40.3±0.4μs       70.0±0.4μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('int16')
+      40.8±0.2μs       70.7±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('timedelta64[ns]')
+      40.1±0.2μs       69.6±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('complex64')
+      40.2±0.2μs       69.8±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('uint64')
+      40.3±0.5μs       69.9±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_string_include('uint32')
+      40.4±0.3μs       70.0±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_float_include('int16')
+      40.2±0.1μs       69.7±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int32')
+      40.2±0.4μs       69.7±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('uint64')
+      40.3±0.5μs       69.8±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int16')
+      41.1±0.2μs       71.1±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('datetime64[ns]')
+      41.0±0.3μs       70.9±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_string_include('datetime64[ns]')
+      40.3±0.5μs       69.7±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int8')
+      40.4±0.1μs       69.9±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('complex128')
+      40.4±0.3μs       69.8±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('uint32')
+      41.1±0.3μs       71.0±0.2μs     1.72  dtypes.SelectDtypes.time_select_dtype_float_include('datetime64[ns]')
+      40.5±0.4μs       69.7±0.4μs     1.72  dtypes.SelectDtypes.time_select_dtype_int_include('uint8')
+      40.6±0.3μs       69.9±0.5μs     1.72  dtypes.SelectDtypes.time_select_dtype_bool_include('uint8')
+      41.4±0.2μs       71.0±0.4μs     1.72  dtypes.SelectDtypes.time_select_dtype_bool_include('datetime64[ns]')
+      47.2±0.7μs       80.5±0.6μs     1.71  replace.ReplaceList.time_replace_list(True)
+     12.9±0.03ms         21.4±3ms     1.65  indexing.ChainIndexing.time_chained_indexing(None)
+      40.1±0.2μs       66.0±0.4μs     1.65  dtypes.SelectDtypes.time_select_dtype_int_exclude('int64')
+      40.3±0.4μs       66.3±0.5μs     1.65  dtypes.SelectDtypes.time_select_dtype_float_exclude('float64')
+         545±2ms          894±8ms     1.64  io.csv.ToCSVDatetimeBig.time_frame(100000)
+      40.2±0.3μs       65.9±0.3μs     1.64  dtypes.SelectDtypes.time_select_dtype_bool_exclude('bool')
+      47.2±0.8ms       77.2±0.4ms     1.64  replace.Convert.time_replace('DataFrame', 'Timedelta')
+     1.25±0.02ms      2.04±0.03ms     1.64  timeseries.ResampleDataFrame.time_method('mean')
+      47.9±0.7ms       77.1±0.4ms     1.61  replace.Convert.time_replace('DataFrame', 'Timestamp')
+     6.11±0.04ms      9.83±0.03ms     1.61  io.csv.ToCSVDatetimeBig.time_frame(1000)
+      55.4±0.4ms       88.9±0.2ms     1.61  io.csv.ToCSVDatetimeBig.time_frame(10000)
+      8.93±0.3ms       14.3±0.1ms     1.60  eval.Eval.time_chained_cmp('python', 'all')
+     1.54±0.03ms      2.31±0.02ms     1.50  timeseries.AsOf.time_asof_nan_single('DataFrame')
+     11.6±0.05ms       17.3±0.1ms     1.50  eval.Eval.time_and('python', 'all')
+      17.1±0.2ms       25.5±0.3ms     1.49  indexing.ChainIndexing.time_chained_indexing('warn')
+     1.04±0.01ms       1.55±0.3ms     1.49  series_methods.NanOps.time_func('sum', 1000000, 'int8')
+     13.1±0.06ms      18.2±0.08ms     1.40  io.hdf.HDFStoreDataFrame.time_query_store_table_wide
+        3.39±0ms      4.67±0.06ms     1.38  timeseries.ResampleSeries.time_resample('datetime', '5min', 'ohlc')
+         116±1μs          159±3μs     1.37  indexing.IndexSingleRow.time_iloc_row(True)
+        1.57±0μs      2.13±0.03μs     1.36  indexing.GetItemSingleColumn.time_frame_getitem_single_column_label
+     3.39±0.03ms      4.59±0.03ms     1.36  timeseries.ResampleSeries.time_resample('period', '5min', 'ohlc')
+        1.47±0ms       1.99±0.3ms     1.35  series_methods.NanOps.time_func('prod', 1000000, 'int8')
+     1.78±0.01ms      2.39±0.03ms     1.34  timeseries.AsOf.time_asof_single('DataFrame')
+         125±2μs          163±4μs     1.30  indexing.IndexSingleRow.time_loc_row(True)
+         115±1μs          149±4μs     1.30  indexing.IndexSingleRow.time_iloc_row(False)
+     1.77±0.01μs      2.30±0.03μs     1.30  indexing.GetItemSingleColumn.time_frame_getitem_single_column_int
+       143±0.9μs          185±2μs     1.29  indexing.DataFrameStringIndexing.time_boolean_rows
+         148±1μs          191±2μs     1.29  indexing.DataFrameStringIndexing.time_boolean_rows_boolean
+         124±2μs          159±2μs     1.28  indexing.IndexSingleRow.time_loc_row(False)
+         190±1μs        240±0.7μs     1.26  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+         193±3μs          240±3μs     1.25  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 1000000)
+       110±0.9μs        137±0.4μs     1.24  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 500000)
+      21.5±0.2μs       26.5±0.2μs     1.24  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+        1.68±0ms      2.07±0.01ms     1.23  timeseries.ResampleDataFrame.time_method('max')
+      21.2±0.2μs       26.2±0.3μs     1.23  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'nonunique_monotonic_inc')
+      44.3±0.1μs       54.4±0.3μs     1.23  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'int'>)
+     21.4±0.07μs       26.3±0.3μs     1.23  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         181±1μs          223±2μs     1.23  indexing.DataFrameStringIndexing.time_boolean_rows_object
+      44.2±0.2μs       54.3±0.4μs     1.23  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'int'>)
+      44.1±0.2μs       54.1±0.3μs     1.23  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'int'>)
+      21.3±0.2μs       26.0±0.1μs     1.22  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'nonunique_monotonic_inc')
+      21.3±0.2μs       25.9±0.2μs     1.21  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+      45.1±0.4μs       54.6±0.4μs     1.21  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'float'>)
+      45.2±0.6μs       54.7±0.4μs     1.21  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'float'>)
+      37.0±0.5μs       44.8±0.4μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'nonunique_monotonic_inc')
+      37.1±0.4μs       44.9±0.2μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'unique_monotonic_inc')
+      37.0±0.2μs       44.8±0.3μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'non_monotonic')
+      21.4±0.2μs       25.8±0.2μs     1.20  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+      45.4±0.7μs       54.4±0.5μs     1.20  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'float'>)
+     1.66±0.01ms      1.99±0.01ms     1.20  timeseries.ResampleDataFrame.time_method('min')
+      26.6±0.3μs       31.8±0.1μs     1.20  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'nonunique_monotonic_inc')
+      47.5±0.5μs       56.8±0.1μs     1.20  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 100000)
+      35.8±0.2μs      42.8±0.09μs     1.20  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 10000)
+      49.9±0.1μs       59.6±0.1μs     1.19  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('string', 'unique_monotonic_inc')
+      47.4±0.5μs       56.6±0.9μs     1.19  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 100000)
+     2.14±0.03μs      2.55±0.02μs     1.19  attrs_caching.DataFrameAttributes.time_set_index
+         552±5ns          658±9ns     1.19  attrs_caching.SeriesArrayAttribute.time_array('datetime64tz')
+        555±10ns          661±8ns     1.19  attrs_caching.SeriesArrayAttribute.time_array('category')
+      41.5±0.1μs       49.4±0.2μs     1.19  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+      61.6±0.3ms         73.2±1ms     1.19  io.style.Render.time_tooltips_render(24, 120)
+      32.9±0.3μs       39.0±0.2μs     1.18  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'non_monotonic')
+      43.9±0.1μs       52.0±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         210±2μs          249±1μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+      26.8±0.2μs       31.7±0.3μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+      36.5±0.4μs       43.1±0.2μs     1.18  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 10000)
+      26.8±0.1μs       31.6±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'nonunique_monotonic_inc')
+      26.7±0.1μs       31.5±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+      33.0±0.8μs      38.8±0.07μs     1.18  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'nonunique_monotonic_inc')
+     4.58±0.03μs      5.38±0.05μs     1.18  indexing.DataFrameStringIndexing.time_getitem_scalar
+      38.5±0.2μs       45.2±0.5μs     1.17  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'unique_monotonic_inc')
+      87.8±0.5ms        103±0.8ms     1.17  io.style.Render.time_tooltips_render(36, 120)
+     7.19±0.05μs      8.40±0.07μs     1.17  indexing.DataFrameStringIndexing.time_loc
+      49.8±0.3μs       58.1±0.5μs     1.17  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+      39.2±0.6μs       45.5±0.8μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'non_monotonic')
+      61.4±0.2μs       71.1±0.1μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('string', 'nonunique_monotonic_inc')
+      33.3±0.5μs       38.5±0.3μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'unique_monotonic_inc')
+      39.1±0.3μs       45.2±0.6μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'nonunique_monotonic_inc')
+      43.3±0.2μs      50.0±0.08μs     1.15  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+      53.5±0.2μs       61.8±0.2μs     1.15  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'complex'>)
+      57.6±0.4μs       66.4±0.6μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int8')
+      37.2±0.4μs       42.9±0.6μs     1.15  timeseries.SortIndex.time_get_slice(False)
+      60.6±0.2μs       69.8±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt16')
+      27.8±0.1ms       32.0±0.2ms     1.15  io.hdf.HDF.time_write_hdf('fixed')
+      1.72±0.1μs       1.97±0.3μs     1.15  index_cached_properties.IndexCache.time_values('PeriodIndex')
+      60.5±0.2μs       69.4±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt16')
+        61.5±1μs       70.5±0.4μs     1.15  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt32')
+     36.6±0.08ms       42.0±0.6ms     1.15  io.style.Render.time_tooltips_render(12, 120)
+      60.1±0.3μs       68.9±0.2μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt8')
+      53.7±0.3μs       61.5±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'complex'>)
+      57.0±0.3μs       65.2±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int8')
+      57.8±0.1μs       66.1±0.1μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int16')
+      53.6±0.3μs       61.3±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'bool'>)
+      53.7±0.6μs       61.5±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'bool'>)
+      59.6±0.3μs       68.1±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int64')
+     15.6±0.05ms       17.8±0.2ms     1.14  io.csv.ReadCSVThousands.time_thousands(',', None, 'c')
+      58.5±0.5μs       66.9±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int32')
+      61.4±0.2μs       70.2±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt32')
+      58.1±0.2μs       66.4±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int16')
+      60.1±0.7μs       68.6±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt8')
+      61.4±0.4μs       70.1±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt32')
+      53.9±0.8μs       61.5±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'bool'>)
+      60.2±0.4μs       68.7±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt8')
+      60.2±0.2μs       68.6±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt8')
+      57.3±0.3μs       65.2±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int8')
+      61.6±0.2μs       70.2±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt32')
+      61.0±0.2μs       69.4±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt16')
+      59.7±0.2μs       67.9±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int64')
+      58.0±0.1μs       66.1±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int16')
+      58.6±0.2μs       66.7±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int32')
+      53.8±0.2μs       61.2±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'complex'>)
+      57.4±0.5μs       65.3±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int8')
+      62.1±0.2μs       70.6±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt64')
+      62.3±0.3μs       70.8±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt64')
+     59.8±0.09μs       67.9±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int64')
+     25.5±0.09ms       28.9±0.1ms     1.14  rolling.Apply.time_rolling('Series', 3, 'float', <built-in function sum>, False)
+     15.5±0.02ms       17.6±0.1ms     1.14  io.csv.ReadCSVThousands.time_thousands('|', None, 'c')
+      85.4±0.3ms         96.9±2ms     1.14  io.json.ToJSON.time_to_json('split', 'df')
+      62.1±0.5μs       70.5±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt64')
+      44.0±0.5μs       49.9±0.2μs     1.13  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'int'>)
+     25.5±0.09ms       29.0±0.2ms     1.13  rolling.Apply.time_rolling('Series', 3, 'int', <built-in function sum>, False)
+      62.0±0.4μs       70.3±0.3μs     1.13  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt64')
+      25.7±0.3ms       29.0±0.2ms     1.13  rolling.Apply.time_rolling('DataFrame', 3, 'int', <built-in function sum>, False)
+      25.6±0.2ms       28.9±0.4ms     1.13  rolling.Apply.time_rolling('DataFrame', 3, 'float', <built-in function sum>, False)
+      44.5±0.2μs       50.2±0.1μs     1.13  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'float'>)
+      78.4±0.3ms         88.4±2ms     1.13  io.json.ToJSONWide.time_to_json('values', 'df')
+      70.8±0.1μs       79.8±0.4μs     1.13  dtypes.SelectDtypes.time_select_dtype_int_exclude('m8[ns]')
+      71.2±0.3μs         80.2±1μs     1.13  dtypes.SelectDtypes.time_select_dtype_float_exclude('int16')
+        88.9±2ms        100±0.9ms     1.13  io.json.ToJSON.time_to_json('split', 'df_date_idx')
+      59.3±0.9μs       66.6±0.2μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int32')
+      77.3±0.5ms         86.7±1ms     1.12  io.json.ToJSON.time_to_json('values', 'df_date_idx')
+      59.5±0.4μs       66.8±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int32')
+      52.6±0.2μs       59.0±0.6μs     1.12  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 10000)
+         496±9ns          557±8ns     1.12  index_object.IntervalIndexMethod.time_is_unique(100000)
+      70.9±0.1μs       79.5±0.9μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int64')
+      71.0±0.3μs       79.5±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('float32')
+      70.9±0.3μs       79.3±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('m8[ns]')
+      23.7±0.3ms       26.5±0.1ms     1.12  io.style.Render.time_tooltips_render(36, 12)
+      70.9±0.4μs       79.3±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('m8[ns]')
+      70.9±0.3μs       79.3±0.8μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint64')
+      76.9±0.7ms       86.0±0.5ms     1.12  io.json.ToJSON.time_to_json('values', 'df')
+      70.8±0.3μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('M8[ns]')
+        3.07±0ms       3.43±0.1ms     1.12  indexing.InsertColumns.time_assign_list_of_columns_concat
+      70.8±0.3μs       79.1±0.7μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint16')
+      70.9±0.3μs       79.3±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('m8[ns]')
+      71.3±0.3μs       79.6±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('M8[ns]')
+      70.9±0.2μs       79.3±0.8μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int8')
+      71.1±0.3μs       79.5±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('int64')
+      55.2±0.2μs       61.6±0.3μs     1.12  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'nonunique_monotonic_inc')
+      70.8±0.2μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('bool')
+        80.1±2ms         89.5±2ms     1.12  io.json.ToJSONWide.time_to_json('values', 'df_date_idx')
+      70.8±0.2μs       79.0±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('int8')
+        157±20ms          176±7ms     1.12  gil.ParallelGroupbyMethods.time_loop(8, 'count')
+      70.9±0.3μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int32')
+      70.7±0.3μs       78.9±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('int8')
+      71.2±0.3μs       79.4±0.9μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('float32')
+      70.9±0.4μs       79.1±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('bool')
+      71.1±0.4μs       79.3±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('int64')
+      70.7±0.3μs       78.8±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('bool')
+      70.9±0.2μs       79.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint8')
+      71.4±0.5μs       79.6±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('M8[ns]')
+      71.2±0.3μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('float32')
+      70.9±0.4μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint16')
+      70.9±0.2μs       79.0±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint64')
+      56.5±0.8μs       62.9±0.2μs     1.11  indexing.DataFrameNumericIndexing.time_loc
+      70.9±0.4μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint8')
+      70.9±0.3μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('complex128')
+      71.2±0.4μs       79.2±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint16')
+      71.1±0.5μs       79.1±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint32')
+      72.7±0.7μs       81.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('datetime64[ns]')
+      71.2±0.4μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('complex128')
+      71.0±0.2μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint8')
+      51.7±0.6μs       57.5±0.2μs     1.11  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 10000)
+        46.8±3ms       52.0±0.1ms     1.11  io.hdf.HDFStoreDataFrame.time_write_store_table_wide
+      71.4±0.3μs       79.4±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('float32')
+      71.1±0.3μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int8')
+      71.1±0.5μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint32')
+      72.6±0.5μs       80.6±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('datetime64[ns]')
+      71.4±0.3μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('int16')
+      71.3±0.5μs       79.2±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int32')
+      71.3±0.4μs       79.2±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('M8[ns]')
+      71.2±0.3μs       79.1±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('int32')
+      71.0±0.5μs       78.8±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint8')
+      71.2±0.2μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint64')
+      71.0±0.2μs       78.8±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int16')
+      71.3±0.5μs       79.1±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint32')
+      71.2±0.3μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int16')
+      71.2±0.4μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('complex128')
+      71.5±0.3μs       79.3±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('complex64')
+        87.4±3ms         97.0±2ms     1.11  io.json.ToJSONWide.time_to_json('records', 'df')
+      71.4±0.3μs       79.2±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint32')
+      71.5±0.6μs       79.2±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('float64')
+        78.2±8ms         86.6±3ms     1.11  gil.ParallelGroupbyMethods.time_loop(4, 'count')
+      71.1±0.2μs       78.8±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('int32')
+      71.5±0.3μs       79.2±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint64')
+      72.7±0.6μs       80.5±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('datetime64[ns]')
+      71.3±0.5μs       78.9±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('complex128')
+      72.3±0.3μs       80.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('timedelta64[ns]')
+      51.5±0.3μs       56.9±0.4μs     1.11  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 10000)
+      71.3±0.5μs       78.7±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('float64')
+      57.2±0.1μs       63.2±0.7μs     1.10  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 10000)
+      71.2±0.3μs       78.6±0.2μs     1.10  dtypes.SelectDtypes.time_select_dtype_int_exclude('complex64')
+      71.4±0.5μs       78.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('complex64')
+      49.2±0.7μs       54.3±0.3μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'non_monotonic')
+      71.5±0.6μs       78.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_string_exclude('complex64')
+      71.4±0.5μs       78.6±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint16')
+       136±0.5ms          150±1ms     1.10  io.stata.StataMissing.time_read_stata('tc')
+      73.0±0.5μs       80.4±0.3μs     1.10  dtypes.SelectDtypes.time_select_dtype_float_exclude('datetime64[ns]')
+      72.6±0.7μs       79.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_string_exclude('timedelta64[ns]')
+      77.8±0.3μs       85.5±0.2μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'non_monotonic')
+      87.2±0.4ms       95.8±0.8ms     1.10  io.json.ToJSON.time_to_json('records', 'df')
+      71.8±0.8μs       78.9±0.5μs     1.10  dtypes.SelectDtypes.time_select_dtype_int_exclude('float64')
+      55.1±0.5μs       60.5±0.8μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'unique_monotonic_inc')
+       136±0.6ms          149±1ms     1.10  io.stata.StataMissing.time_read_stata('tw')
+      92.0±0.6ms        101±0.6ms     1.10  io.json.ToJSONWide.time_to_json('split', 'df_date_idx')
+      32.7±0.2ms      35.8±0.03ms     1.10  rolling.Apply.time_rolling('Series', 300, 'float', <built-in function sum>, False)
+       110±0.5ms          121±3ms     1.09  io.json.ToJSONWide.time_to_json('index', 'df_date_idx')
+      65.3±0.5μs       71.3±0.5μs     1.09  indexing.DataFrameNumericIndexing.time_iloc
+         131±1ms          142±2ms     1.09  io.stata.StataMissing.time_read_stata('td')
+         133±1ms        144±0.9ms     1.09  io.stata.StataMissing.time_read_stata('tm')
+      85.4±0.6μs       92.7±0.2μs     1.09  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'nonunique_monotonic_inc')
+     32.8±0.08ms       35.6±0.1ms     1.09  rolling.Apply.time_rolling('Series', 300, 'int', <built-in function sum>, False)
+      88.1±0.8ms         95.5±1ms     1.08  io.json.ToJSONWide.time_to_json('split', 'df')
+     5.09±0.04μs       5.52±0.1μs     1.08  indexing.NonNumericSeriesIndexing.time_getitem_scalar('period', 'non_monotonic')
+       104±0.5ms        113±0.6ms     1.08  io.json.ToJSON.time_to_json('index', 'df')
+         103±2ms          112±1ms     1.08  io.json.ToJSONWide.time_to_json('index', 'df')
+     13.5±0.05ms      14.6±0.03ms     1.08  io.csv.ReadCSVSkipRows.time_skipprows(10000, 'c')
+     14.5±0.04ms      15.6±0.07ms     1.08  io.style.Render.time_tooltips_render(12, 12)
+         1.12±0s       1.21±0.02s     1.08  strings.Dummies.time_get_dummies('string[pyarrow]')
+       134±0.6ms          145±1ms     1.08  io.stata.StataMissing.time_read_stata('tq')
+     3.20±0.01ms      3.45±0.02ms     1.08  series_methods.NanOps.time_func('std', 1000000, 'int8')
+      84.0±0.7μs       90.7±0.4μs     1.08  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'unique_monotonic_inc')
+      53.1±0.3μs       57.3±0.1μs     1.08  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'bool'>)
+       256±0.9ns          276±6ns     1.08  timeseries.DatetimeIndex.time_is_dates_only('dst')
+         128±2μs          137±3μs     1.08  indexing.IntervalIndexing.time_getitem_list
+      33.1±0.3ms       35.6±0.1ms     1.08  rolling.Apply.time_rolling('DataFrame', 300, 'float', <built-in function sum>, False)
+      1.10±0.01s          1.18±0s     1.08  strings.Dummies.time_get_dummies('str')
+       137±0.9ms          147±2ms     1.07  io.json.ToJSONLines.time_floats_with_int_idex_lines
+     4.43±0.05μs      4.75±0.05μs     1.07  indexing.NonNumericSeriesIndexing.time_getitem_scalar('string', 'non_monotonic')
+      89.5±0.6ms       96.0±0.9ms     1.07  io.json.ToJSON.time_to_json('records', 'df_date_idx')
+        177±20ms          190±5ms     1.07  gil.ParallelGroupbyMethods.time_loop(8, 'mean')
+      33.0±0.2ms      35.4±0.07ms     1.07  rolling.Apply.time_rolling('DataFrame', 300, 'int', <built-in function sum>, False)
+       145±0.6μs          155±2μs     1.07  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 100000)
+        80.9±8ms         86.7±1ms     1.07  gil.ParallelGroupbyMethods.time_loop(4, 'last')
+         134±1ms          144±2ms     1.07  io.stata.StataMissing.time_read_stata('th')
+     2.53±0.07μs      2.71±0.05μs     1.07  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(0, 'end', 'year', 'QS', 12)
+      59.1±0.2μs       63.2±0.2μs     1.07  dtypes.SelectDtypes.time_select_dtype_int_include('Int64')
+      1.11±0.01s          1.19±0s     1.07  strings.Dummies.time_get_dummies('string[python]')
+     2.53±0.03μs      2.70±0.05μs     1.07  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'quarter', None, 5)
+      6.91±0.2μs      7.36±0.07μs     1.07  tslibs.timestamp.TimestampProperties.time_is_quarter_start(None, 'B')
+      70.6±0.3μs       75.2±0.7μs     1.07  dtypes.SelectDtypes.time_select_dtype_float_include('float64')
+        88.2±9ms         93.9±1ms     1.06  gil.ParallelGroupbyMethods.time_loop(4, 'sum')
+      26.1±0.1ms      27.8±0.05ms     1.06  io.hdf.HDF.time_read_hdf('fixed')
+     3.21±0.01ms      3.41±0.03ms     1.06  series_methods.NanOps.time_func('var', 1000000, 'int8')
+     6.11±0.02μs      6.49±0.05μs     1.06  indexing.NonNumericSeriesIndexing.time_getitem_scalar('string', 'unique_monotonic_inc')
+      11.2±0.1ms      11.9±0.09ms     1.06  io.style.Render.time_apply_render(36, 12)
+      16.0±0.2μs       16.9±0.2μs     1.06  indexing.NonNumericSeriesIndexing.time_getitem_scalar('datetime', 'nonunique_monotonic_inc')
+     2.51±0.02μs      2.66±0.01μs     1.06  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 12)
+         137±2ms        145±0.5ms     1.06  io.json.ToJSONLines.time_floats_with_dt_index_lines
+     7.18±0.01ms       7.61±0.1ms     1.06  series_methods.NanOps.time_func('sem', 1000000, 'int8')
+        170±20ms          180±5ms     1.06  gil.ParallelGroupbyMethods.time_loop(8, 'min')
+        81.8±9ms       86.6±0.7ms     1.06  gil.ParallelGroupbyMethods.time_loop(4, 'prod')
+         147±1μs          156±3μs     1.06  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 100000)
+      70.3±0.2μs       74.4±0.5μs     1.06  dtypes.SelectDtypes.time_select_dtype_bool_include('bool')
+      70.3±0.2μs       74.3±0.3μs     1.06  dtypes.SelectDtypes.time_select_dtype_int_include('int64')
+     2.51±0.02μs      2.65±0.02μs     1.06  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 3)
+     2.91±0.04μs      3.07±0.02μs     1.05  series_methods.SeriesGetattr.time_series_datetimeindex_repr
+     2.55±0.02μs      2.69±0.07μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(0, 'end', 'quarter', 'QS', 5)
+     5.20±0.09μs      5.47±0.02μs     1.05  indexing.NumericSeriesIndexing.time_getitem_scalar(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         254±2ns          268±1ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_local')
+     8.62±0.05ms       9.07±0.1ms     1.05  io.style.Render.time_format_render(36, 12)
+     2.56±0.03μs      2.69±0.01μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'start', 'month', 'QS', 5)
+         288±3ns          303±1ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_naive')
+      28.8±0.1ms       30.2±0.2ms     1.05  io.style.Render.time_apply_render(12, 120)
+        1.36±0μs      1.43±0.02μs     1.05  attrs_caching.SeriesArrayAttribute.time_extract_array_numpy('object')
+     2.64±0.03μs      2.77±0.04μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'quarter', 'QS', 5)
+       254±0.7ns          265±2ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_aware')
+     1.34±0.01μs      1.41±0.02μs     1.05  attrs_caching.SeriesArrayAttribute.time_extract_array('datetime64')
+     5.35±0.03μs      5.59±0.01μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply(<Day>)
+     2.55±0.02μs      2.65±0.04μs     1.04  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 5)
+     4.50±0.03ms      4.68±0.03ms     1.04  io.csv.ReadCSVParseSpecialDate.time_read_special_date('mdY', 'c')
+      45.0±0.2μs       46.8±0.2μs     1.04  indexing.NumericSeriesIndexing.time_iloc_list_like(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+     9.10±0.06ms      9.46±0.05ms     1.04  inference.ToDatetimeISO8601.time_iso8601_infer_zero_tz_fromat
+     5.57±0.02μs      5.79±0.07μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply_np_dt64(<Day>)
+      13.2±0.3μs      13.7±0.06μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply_np_dt64(<BusinessMonthBegin>)
+     2.63±0.04μs      2.73±0.02μs     1.04  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', 'QS', 12)
+     1.36±0.01μs      1.41±0.01μs     1.04  attrs_caching.SeriesArrayAttribute.time_extract_array('category')
+      6.02±0.2μs       6.24±0.1μs     1.04  index_cached_properties.IndexCache.time_engine('DatetimeIndex')
+      24.8±0.1ms      25.7±0.07ms     1.04  gil.ParallelGroupbyMethods.time_parallel(2, 'last')
+     11.2±0.08ms      11.6±0.05ms     1.04  algorithms.Hashing.time_series_string
+       315±0.5ms          326±5ms     1.03  io.json.ReadJSONLines.time_read_json_lines('datetime')
+      83.0±0.2ms       85.9±0.6ms     1.03  io.hdf.HDF.time_write_hdf('table')
+       259±0.2ms          268±6ms     1.03  io.json.ReadJSON.time_read_json('records', 'int')
+         270±2μs          280±1μs     1.03  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 100000)
+     1.36±0.01μs      1.41±0.01μs     1.03  attrs_caching.SeriesArrayAttribute.time_extract_array_numpy('datetime64tz')
+      23.3±0.1μs       24.1±0.1μs     1.03  tslibs.offsets.OffestDatetimeArithmetic.time_apply(<CustomBusinessDay>)
+     1.30±0.01μs         1.34±0μs     1.03  tslibs.offsets.OnOffset.time_on_offset(<DateOffset: days=2, months=2>)
+     1.05±0.03μs      1.09±0.04μs     1.03  index_cached_properties.IndexCache.time_is_monotonic_decreasing('Int64Index')
+      26.7±0.2ms      27.5±0.07ms     1.03  gil.ParallelGroupbyMethods.time_parallel(2, 'sum')
+     5.43±0.04μs      5.58±0.03μs     1.03  tslibs.offsets.OffestDatetimeArithmetic.time_add_10(<Day>)
+     1.46±0.01μs      1.50±0.01μs     1.03  tslibs.timestamp.TimestampConstruction.time_from_datetime_aware
+         153±1μs        157±0.7μs     1.03  period.Algorithms.time_drop_duplicates('series')
+     1.19±0.02ms      1.22±0.02ms     1.03  index_cached_properties.IndexCache.time_engine('MultiIndex')
+         431±1ns          442±2ns     1.03  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'non_monotonic', True, 2000000)
+     5.23±0.02ms      5.36±0.01ms     1.02  indexing.DataFrameNumericIndexing.time_bool_indexer
+       146±0.5μs        149±0.6μs     1.02  tslibs.period.PeriodProperties.time_property('M', 'end_time')
+       402±0.6ns          411±1ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'monotonic_decr', True, 100000)
+      7.01±0.1ms       7.15±0.1ms     1.02  index_cached_properties.IndexCache.time_is_all_dates('CategoricalIndex')
+       101±0.1ms        103±0.4ms     1.02  rolling.Apply.time_rolling('Series', 3, 'int', <function sum at 0x7ff1cd1ff040>, False)
+     5.94±0.01ms      6.06±0.01ms     1.02  io.hdf.HDFStoreDataFrame.time_read_store_table
+      71.6±0.3ms       73.0±0.3ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'float', <function sum at 0x7ff1cd1ff040>, False)
+     4.62±0.02ms      4.71±0.06ms     1.02  ctors.SeriesConstructors.time_series_constructor(<function gen_of_tuples at 0x7ff1b5092820>, False, 'float')
+         414±2ns          422±2ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'non_monotonic', True, 100000)
+         414±1ns          422±2ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'monotonic_decr', True, 100000)
+      90.6±0.2μs       92.3±0.5μs     1.02  tslibs.timestamp.TimestampOps.time_floor(datetime.timezone.utc)
+      73.0±0.5ms       74.3±0.1ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+     4.62±0.03ms      4.70±0.05ms     1.02  ctors.SeriesConstructors.time_series_constructor(<function gen_of_tuples at 0x7ff1b5092820>, False, 'int')
+      79.5±0.3μs       80.9±0.7μs     1.02  tslibs.timestamp.TimestampOps.time_floor(None)
+      71.8±0.2ms       72.9±0.1ms     1.02  rolling.Apply.time_rolling('Series', 300, 'float', <function sum at 0x7ff1cd1ff040>, False)
+      68.5±0.7μs       69.6±0.7μs     1.02  ctors.SeriesConstructors.time_series_constructor(<function no_change at 0x7ff1b5045820>, True, 'float')
+      73.1±0.2ms       74.2±0.2ms     1.02  rolling.Apply.time_rolling('Series', 300, 'int', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+     4.22±0.03ms      4.28±0.06ms     1.01  ctors.SeriesConstructors.time_series_constructor(<function arr_dict at 0x7ff1b5092940>, True, 'float')
+      73.2±0.2ms       74.2±0.2ms     1.01  rolling.Apply.time_rolling('Series', 300, 'float', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+         804±9μs          815±9μs     1.01  ctors.SeriesConstructors.time_series_constructor(<function list_of_str at 0x7ff1b50458b0>, True, 'int')
+       103±0.3ms       105±0.04ms     1.01  rolling.Apply.time_rolling('Series', 3, 'float', <function Apply.<lambda> at 0x7ff1b2310940>, False)
-         128±1ms        127±0.8ms     0.99  index_cached_properties.IndexCache.time_engine('IntervalIndex')
-         535±2μs          529±2μs     0.99  indexing.CategoricalIndexIndexing.time_get_indexer_list('monotonic_decr')
-     5.39±0.01ms         5.33±0ms     0.99  rolling.Methods.time_method('Series', ('rolling', {'window': 1000}), 'float', 'count')
-         219±7μs          217±7μs     0.99  index_cached_properties.IndexCache.time_is_monotonic('UInt64Index')
-     55.2±0.09ms      54.6±0.05ms     0.99  strings.Cat.time_cat(3, None, '-', 0.0)
-     1.68±0.02ms      1.66±0.01ms     0.99  index_cached_properties.IndexCache.time_is_all_dates('RangeIndex')
-     2.32±0.04ms      2.29±0.02ms     0.99  index_cached_properties.IndexCache.time_is_all_dates('IntervalIndex')
-      48.4±0.1ms       47.8±0.1ms     0.99  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float64', 5, 'monotone_misses')
-         129±1ms        127±0.7ms     0.99  index_cached_properties.IndexCache.time_is_monotonic_increasing('IntervalIndex')
-         840±2ns          828±5ns     0.99  dtypes.Dtypes.time_pandas_dtype(<class 'pandas.core.arrays.integer.UInt64Dtype'>)
-      4.12±0.2ms      4.06±0.03ms     0.98  index_cached_properties.IndexCache.time_is_unique('MultiIndex')
-      33.1±0.1ms       32.5±0.2ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'random_misses')
-      33.0±0.2ms       32.5±0.1ms     0.98  rolling.Rank.time_rank('Series', 10, 'float', True, False, 'min')
-      49.5±0.1μs       48.7±0.2μs     0.98  series_methods.NanOps.time_func('sum', 1000, 'float64')
-         889±4μs          874±7μs     0.98  frame_ctor.FromRecords.time_frame_from_records_generator(1000)
-       217±0.6ns          213±3ns     0.98  libs.ScalarListLike.time_is_scalar(array('123', dtype='<U3'))
-     33.8±0.09ms      33.2±0.08ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('int32', 5, 'monotone_hits')
-      33.0±0.1ms       32.4±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'monotone_hits')
-       203±0.6ns          199±2ns     0.98  libs.ScalarListLike.time_is_scalar((1+2j))
-      34.4±0.2ms      33.7±0.04ms     0.98  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0.5, 'midpoint')
-      34.1±0.2ms       33.4±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('int32', 5, 'random_misses')
-       164±0.8ms        161±0.3ms     0.98  io.hdf.HDFStoreDataFrame.time_write_store_table_dc
-      41.0±0.1μs       40.2±0.3μs     0.98  tslibs.timestamp.TimestampOps.time_normalize(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-      40.0±0.1μs       39.2±0.2μs     0.98  series_methods.NanOps.time_func('max', 1000, 'int8')
-      33.0±0.1ms       32.3±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'random_hits')
-         451±2ns          441±1ns     0.98  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int64Engine'>, <class 'numpy.int64'>), 'monotonic_decr', True, 100000)
-     3.61±0.01ms      3.53±0.02ms     0.98  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'midpoint')
-         844±4ns          824±2ns     0.98  dtypes.Dtypes.time_pandas_dtype(<class 'pandas.core.arrays.integer.Int8Dtype'>)
-      34.2±0.2ms       33.4±0.2ms     0.98  rolling.Methods.time_method('Series', ('rolling', {'window': 10}), 'int', 'median')
-      20.1±0.2μs       19.7±0.1μs     0.98  series_methods.NanOps.time_func('argmax', 1000, 'int8')
-         660±4ns          644±2ns     0.98  tslibs.timestamp.TimestampOps.time_to_pydatetime(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-      29.4±0.1μs       28.7±0.2μs     0.98  series_methods.NanOps.time_func('prod', 1000, 'int32')
-         506±1ns          494±2ns     0.98  tslibs.timestamp.TimestampProperties.time_dayofweek(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>, None)
-      54.9±0.1ms       53.6±0.2ms     0.98  io.csv.ReadCSVSkipRows.time_skipprows(10000, 'python')
-     3.80±0.01ms      3.70±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'min')
-     33.5±0.08ms       32.6±0.1ms     0.97  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'monotone_misses')
-     4.28±0.01ms      4.17±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'kurt')
-     3.81±0.02ms      3.71±0.02ms     0.97  libs.InferDtype.time_infer_dtype('py-object')
-        2.89±0ms      2.81±0.01ms     0.97  indexing.IntervalIndexing.time_getitem_scalar
-     1.74±0.01ms         1.70±0ms     0.97  rolling.Pairwise.time_pairwise(({'window': 1000}, 'rolling'), 'corr', False)
-     4.28±0.02ms      4.17±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'kurt')
-       217±0.5ns          211±3ns     0.97  libs.ScalarListLike.time_is_scalar((1, 2, 3))
-     2.80±0.01ms         2.72±0ms     0.97  series_methods.NSort.time_nlargest('all')
-         175±1ms          170±2ms     0.97  strings.Extract.time_extract_single_group('string[pyarrow]', True)
-     4.05±0.02ms      3.94±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'min')
-     3.66±0.01ms      3.56±0.02ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'nearest')
-     4.09±0.01ms      3.98±0.03ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'max')
-     7.00±0.08μs      6.80±0.08μs     0.97  tslibs.period.TimeDT64ArrToPeriodArr.time_dt64arr_to_periodarr(0, 2000, tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-      21.2±0.1ms       20.6±0.2ms     0.97  io.sql.WriteSQLDtypes.time_to_sql_dataframe_column('sqlite', 'float_with_nan')
-     4.08±0.01ms      3.96±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'max')
-     3.76±0.01ms         3.64±0ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'max')
-     5.53±0.03ms      5.37±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'count')
-     10.7±0.06μs      10.4±0.03μs     0.97  timedelta.TimedeltaIndexing.time_series_loc
-     1.28±0.01ms      1.24±0.01ms     0.97  rolling.Pairwise.time_pairwise(({'window': 10}, 'rolling'), 'cov', False)
-     3.69±0.01ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'skew')
-     3.66±0.01ms      3.55±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'linear')
-     3.62±0.02ms      3.51±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'nearest')
-     4.20±0.01ms      4.08±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'max')
-     3.97±0.01ms      3.85±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'min')
-     3.69±0.02ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'min')
-     3.56±0.01ms      3.45±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'std')
-     4.15±0.03ms      4.02±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'min')
-         144±1ms        140±0.5ms     0.97  plotting.FramePlotting.time_frame_plot('hist')
-         634±4μs        615±0.5μs     0.97  indexing.NonNumericSeriesIndexing.time_getitem_list_like('datetime', 'nonunique_monotonic_inc')
-     4.05±0.01ms      3.93±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'min')
-     3.66±0.02ms         3.55±0ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'midpoint')
-     3.67±0.01ms      3.55±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'max')
-     3.69±0.02ms      3.57±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0, 'higher')
-     2.66±0.02ms      2.58±0.02ms     0.97  io.csv.ReadCSVParseDates.time_multiple_date('python')
-     2.62±0.01ms      2.54±0.01ms     0.97  series_methods.NSort.time_nlargest('last')
-     3.74±0.03ms      3.62±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'max')
-     3.63±0.02ms      3.51±0.02ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'linear')
-     4.02±0.01ms      3.89±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'max')
-     3.86±0.01ms      3.74±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'max')
-     5.48±0.02ms      5.30±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'count')
-      19.9±0.1ms       19.2±0.1ms     0.97  io.sql.WriteSQLDtypes.time_to_sql_dataframe_column('sqlite', 'int')
-     3.70±0.01ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'skew')
-     3.99±0.03ms      3.86±0.01ms     0.97  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '.', None)
-     4.63±0.02ms      4.48±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'kurt')
-     3.74±0.02ms      3.61±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 1, 'midpoint')
-      9.14±0.1μs      8.84±0.02μs     0.97  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(100, tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-     3.69±0.01ms      3.56±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'higher')
-     3.36±0.02ms      3.24±0.01ms     0.97  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'min')
-     3.57±0.01ms      3.45±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'std')
-     4.54±0.02ms      4.38±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'kurt')
-     3.99±0.02ms      3.85±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'max')
-     3.64±0.02ms      3.51±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'min')
-     3.13±0.01ms      3.02±0.02ms     0.97  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'max')
-        4.03±0ms      3.89±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'min')
-      28.2±0.1ms       27.2±0.3ms     0.96  rolling.Groupby.time_method('sum', ('rolling', {'window': '30s', 'on': 'C'}))
-     9.80±0.08ms      9.45±0.04ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'sem')
-     2.32±0.02ms      2.24±0.02ms     0.96  io.csv.ReadCSVParseDates.time_multiple_date('c')
-     4.04±0.03ms      3.89±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'skew')
-     3.34±0.01ms      3.23±0.01ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'max')
-     3.30±0.01ms         3.19±0ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'min')
-     2.83±0.01ms      2.73±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'skew')
-     2.43±0.01ms      2.34±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'linear')
-     3.97±0.01ms         3.83±0ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'skew')
-     9.89±0.06ms      9.53±0.06ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'sem')
-      3.41±0.2μs       3.29±0.2μs     0.96  index_cached_properties.IndexCache.time_values('TimedeltaIndex')
-     4.65±0.01ms      4.48±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'kurt')
-     3.52±0.07ms      3.39±0.02ms     0.96  index_cached_properties.IndexCache.time_is_unique('Float64Index')
-     1.41±0.01ms      1.36±0.01ms     0.96  rolling.Apply.time_rolling('DataFrame', 3, 'int', <built-in function sum>, True)
-     4.42±0.03ms      4.26±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'kurt')
-     2.57±0.01ms      2.48±0.04ms     0.96  series_methods.NSort.time_nsmallest('all')
-     5.59±0.07ms      5.38±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'count')
-     4.03±0.02ms      3.88±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'skew')
-     6.28±0.02ms      6.05±0.02ms     0.96  index_object.SetOperations.time_operation('int', 'symmetric_difference')
-     12.4±0.03μs      11.9±0.04μs     0.96  tslibs.tz_convert.TimeTZConvert.time_tz_localize_to_utc(1, tzlocal())
-     2.42±0.02μs      2.33±0.01μs     0.96  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.UInt64Engine'>, <class 'numpy.uint64'>), 'monotonic_decr', True, 2000000)
-      22.5±0.3μs       21.6±0.1μs     0.96  series_methods.All.time_all(1000, 'fast', 'bool')
-     3.48±0.02ms      3.34±0.02ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'std')
-     3.75±0.02ms      3.60±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 1, 'linear')
-      9.87±0.1ms      9.48±0.04ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'sem')
-     3.43±0.02ms      3.30±0.01ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'max')
-      35.5±0.5μs       34.1±0.3μs     0.96  series_methods.NanOps.time_func('argmax', 1000, 'float64')
-      30.2±0.5μs       28.9±0.1μs     0.96  series_methods.NanOps.time_func('prod', 1000, 'int8')
-     3.71±0.03ms      3.56±0.02ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0, 'midpoint')
-     2.30±0.01ms      2.21±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'lower')
-      77.8±0.4ms       74.6±0.6ms     0.96  io.csv.ReadCSVSkipRows.time_skipprows(None, 'python')
-        2.44±0ms      2.33±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'nearest')
-     3.33±0.01ms      3.20±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'std')
-     2.46±0.01ms      2.36±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'lower')
-     2.47±0.01ms         2.36±0ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'linear')
-     3.09±0.01ms      2.96±0.03ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'min')
-      87.9±0.3ms       84.1±0.7ms     0.96  strings.Methods.time_partition('str')
-     3.26±0.02ms      3.12±0.02ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'kurt')
-      3.70±0.2μs       3.54±0.2μs     0.96  index_cached_properties.IndexCache.time_values('UInt64Index')
-     2.43±0.01ms      2.32±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'midpoint')
-     2.18±0.01ms      2.08±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'mean')
-      79.8±0.9μs       76.2±0.6μs     0.96  indexing.DataFrameNumericIndexing.time_iloc_dups
-     2.47±0.01ms      2.36±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'higher')
-     1.05±0.05μs      1.01±0.03μs     0.95  index_cached_properties.IndexCache.time_is_monotonic_decreasing('RangeIndex')
-      3.80±0.2μs       3.62±0.2μs     0.95  index_cached_properties.IndexCache.time_inferred_type('IntervalIndex')
-     2.46±0.01ms         2.35±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'nearest')
-     2.44±0.02ms         2.33±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'higher')
-       170±0.7ms        162±0.5ms     0.95  io.stata.Stata.time_write_stata('tw')
-     2.33±0.01ms         2.22±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'higher')
-     2.76±0.05μs      2.63±0.01μs     0.95  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('datetime', 1, None)
-     2.34±0.06μs      2.23±0.08μs     0.95  index_cached_properties.IndexCache.time_shape('DatetimeIndex')
-     2.34±0.01ms         2.23±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'midpoint')
-     2.33±0.02ms         2.22±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'linear')
-      7.43±0.4μs       7.08±0.3μs     0.95  index_cached_properties.IndexCache.time_inferred_type('Float64Index')
-     2.15±0.01ms      2.05±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'mean')
-      35.9±0.3ms       34.2±0.7ms     0.95  io.sql.SQL.time_read_sql_query('sqlalchemy')
-        602±10μs         573±20μs     0.95  index_cached_properties.IndexCache.time_is_monotonic('MultiIndex')
-        2.34±0ms      2.22±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'nearest')
-     3.23±0.01ms      3.07±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'std')
-     2.39±0.02ms      2.27±0.01ms     0.95  series_methods.NSort.time_nsmallest('first')
-            207M             197M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_int_floats')
-        2.26±0ms      2.15±0.01ms     0.95  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'std'), 'float')
-      10.9±0.5μs       10.4±0.3μs     0.95  index_cached_properties.IndexCache.time_engine('UInt64Index')
-     3.25±0.02ms      3.09±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'std')
-        2.44±0ms      2.32±0.04ms     0.95  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'std'), 'int')
-     2.16±0.04μs      2.05±0.01μs     0.95  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(100, datetime.timezone.utc)
-     2.33±0.01ms      2.22±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'lower')
-            208M             198M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_int_float_str')
-            203M             193M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_td_int_ts')
-      11.1±0.4μs       10.5±0.3μs     0.95  index_cached_properties.IndexCache.time_engine('TimedeltaIndex')
-     2.50±0.01ms      2.37±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'mean')
-      22.6±0.3μs       21.4±0.2μs     0.95  series_methods.Any.time_any(1000, 'slow', 'bool')
-        2.51±0ms      2.38±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'mean')
-     2.44±0.01ms      2.32±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'sum')
-         611±2μs          580±6μs     0.95  indexing.NonNumericSeriesIndexing.time_getitem_list_like('string', 'nonunique_monotonic_inc')
-     2.65±0.02ms      2.51±0.02ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'mean')
-     2.30±0.01ms      2.18±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'mean')
-            197M             187M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_int_floats')
-            197M             187M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_int_floats')
-      3.62±0.2μs       3.43±0.2μs     0.95  index_cached_properties.IndexCache.time_values('Float64Index')
-     2.98±0.01ms      2.82±0.01ms     0.95  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'kurt')
-     2.97±0.01ms         2.81±0ms     0.95  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'kurt')
-     3.39±0.03ms      3.21±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'kurt')
-     2.32±0.04ms      2.19±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'higher')
-            198M             188M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_int_float_str')
-            198M             188M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_int_float_str')
-            193M             183M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_td_int_ts')
-            193M             183M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_td_int_ts')
-        603±10μs         571±20μs     0.95  index_cached_properties.IndexCache.time_is_monotonic_increasing('MultiIndex')
-      15.9±0.3ms       15.1±0.1ms     0.95  io.csv.ReadCSVParseSpecialDate.time_read_special_date('hm', 'python')
-     3.26±0.03ms      3.09±0.02ms     0.95  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'min')
-     2.33±0.04ms      2.20±0.02ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'linear')
-        35.0±1μs       33.1±0.2μs     0.95  tslibs.timestamp.TimestampOps.time_replace_tz(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)
-     2.64±0.02ms      2.50±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'mean')
-     3.27±0.03μs      3.10±0.05μs     0.95  index_object.Indexing.time_get_loc_sorted('Int')
-     2.15±0.01ms      2.03±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'std')
-     6.57±0.04μs       6.20±0.2μs     0.94  tslibs.timestamp.TimestampOps.time_replace_None(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)
-     2.04±0.05μs      1.92±0.01μs     0.94  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(1, datetime.timezone.utc)
-     2.15±0.01ms      2.03±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'max')
-     2.46±0.02ms      2.33±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'sum')
-     2.32±0.01ms      2.19±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'sum')
-     1.69±0.08μs       1.60±0.1μs     0.94  index_cached_properties.IndexCache.time_inferred_type('PeriodIndex')
-            181M             170M     0.94  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_td_int_ts')
-     2.99±0.02ms      2.82±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'skew')
-            181M             170M     0.94  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_td_int_ts')
-     3.26±0.01μs      3.07±0.04μs     0.94  index_object.Indexing.time_get_loc('Int')
-        2.34±0ms      2.21±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'sum')
-      3.14±0.1ms      2.96±0.03ms     0.94  index_cached_properties.IndexCache.time_is_unique('DatetimeIndex')
-     1.83±0.01ms      1.72±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'mean')
-      76.6±0.4μs       72.1±0.4μs     0.94  series_methods.ToFrame.time_to_frame('Int64', None)
-     2.38±0.08μs      2.24±0.01μs     0.94  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Float32Engine'>, <class 'numpy.float32'>), 'monotonic_incr', False, 100000)
-     2.33±0.01ms      2.19±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'sum')
-     1.98±0.01ms      1.86±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'min')
-      76.6±0.1μs       72.0±0.2μs     0.94  series_methods.ToFrame.time_to_frame('int64', None)
-      77.6±0.8μs       73.0±0.1μs     0.94  series_methods.ToFrame.time_to_frame('category', None)
-     1.99±0.04ms      1.87±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'sum')
-     2.33±0.03μs      2.19±0.05μs     0.94  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('time', 1, datetime.timezone.utc)
-     2.26±0.01ms      2.12±0.01ms     0.94  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'std'), 'float')
-        852±50ns         799±20ns     0.94  index_cached_properties.IndexCache.time_shape('Int64Index')
-     10.9±0.06ms      10.2±0.02ms     0.94  io.csv.ReadCSVConcatDatetimeBadDateValue.time_read_csv('0')
-     2.05±0.01ms      1.92±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'std')
-      3.17±0.2μs       2.97±0.2μs     0.94  index_cached_properties.IndexCache.time_values('CategoricalIndex')
-      4.32±0.2μs       4.05±0.2μs     0.94  index_cached_properties.IndexCache.time_shape('IntervalIndex')
-        841±40ns         788±40ns     0.94  index_cached_properties.IndexCache.time_shape('RangeIndex')
-     6.40±0.08μs       6.00±0.1μs     0.94  tslibs.timestamp.TimestampOps.time_replace_None(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-        2.44±0ms      2.28±0.02ms     0.94  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'std'), 'int')
-       165±0.9ms        154±0.3ms     0.94  strings.Split.time_split('str', True)
-     2.15±0.03ms         2.01±0ms     0.93  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'sum')
-      77.7±0.9μs       72.6±0.1μs     0.93  series_methods.ToFrame.time_to_frame('category', 'foo')
-      1.80±0.2μs      1.68±0.07μs     0.93  index_cached_properties.IndexCache.time_values('DatetimeIndex')
-      3.39±0.2μs       3.17±0.2μs     0.93  index_cached_properties.IndexCache.time_values('IntervalIndex')
-     2.01±0.01ms      1.87±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'sum')
-     1.96±0.02ms         1.83±0ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'mean')
-     1.29±0.01ms      1.20±0.01ms     0.93  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'mean'), 'int')
-     5.68±0.05ms      5.30±0.04ms     0.93  indexing.MultiIndexing.time_index_slice
-     2.55±0.03μs      2.38±0.02μs     0.93  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('time', 1, None)
-            212M             198M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_int_floats')
-      3.77±0.2μs       3.52±0.2μs     0.93  index_cached_properties.IndexCache.time_inferred_type('CategoricalIndex')
-            207M             193M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_date_idx')
-            206M             192M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_date_idx')
-            213M             199M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_int_float_str')
-            210M             196M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_td_int_ts')
-            208M             193M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_int_floats')
-            204M             190M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_int_floats')
-            208M             194M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_int_float_str')
-     1.96±0.03ms      1.82±0.01ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'mean')
-            199M             185M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df')
-            199M             185M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_date_idx')
-            204M             189M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_td_int_ts')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_date_idx')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_date_idx')
-     1.69±0.01ms      1.57±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'sum')
-            197M             183M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df')
-            196M             182M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df')
-            200M             186M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_td_int_ts')
-     1.61±0.01ms      1.50±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'mean')
-            195M             181M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df')
-            195M             181M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_date_idx')
-            205M             190M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_int_float_str')
-     1.65±0.01ms         1.53±0ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'sum')
-            194M             180M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_date_idx')
-      4.44±0.2μs       4.11±0.1μs     0.93  index_cached_properties.IndexCache.time_engine('PeriodIndex')
-            196M             182M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_int_floats')
-     1.29±0.01ms      1.19±0.01ms     0.93  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'mean'), 'int')
-     1.65±0.01ms      1.52±0.01ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'sum')
-            188M             174M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df')
-            187M             173M     0.93  io.json.ToJSONWide.peakmem_to_json('values', 'df')
-            197M             182M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_int_float_str')
-     1.55±0.01ms      1.44±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'sum')
-            187M             173M     0.93  io.json.ToJSONWide.peakmem_to_json('values', 'df_date_idx')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_date_idx')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_int_floats')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_date_idx')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_int_floats')
-            207M             192M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_int_float_str')
-            190M             176M     0.92  io.json.ToJSONWide.peakmem_to_json('split', 'df_td_int_ts')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_int_floats')
-            206M             191M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_int_floats')
-     1.74±0.01ms      1.61±0.01ms     0.92  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'mean')
-            203M             188M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_date_idx')
-            204M             188M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_td_int_ts')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_td_int_ts')
-            190M             176M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_int_float_str')
-            190M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_int_float_str')
-      4.05±0.2μs       3.74±0.2μs     0.92  index_cached_properties.IndexCache.time_shape('Float64Index')
-     2.16±0.03ms      1.99±0.01ms     0.92  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'sum')
-      3.63±0.1μs       3.35±0.1μs     0.92  index_cached_properties.IndexCache.time_inferred_type('MultiIndex')
-            202M             186M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_int_float_str')
-            202M             186M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_int_floats')
-      7.97±0.3μs       7.36±0.3μs     0.92  index_cached_properties.IndexCache.time_inferred_type('UInt64Index')
-        808±40ns          745±4ns     0.92  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(100, 12000)
-            199M             183M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_int_float_str')
-            190M             175M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_int_float_str')
-            198M             183M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_int_floats')
-            195M             180M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df')
-            197M             181M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_td_int_ts')
-            195M             179M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_date_idx')
-            193M             178M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df')
-            193M             178M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_td_int_ts')
-            190M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_date_idx')
-            191M             176M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df')
-            191M             176M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_date_idx')
-            190M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_int_floats')
-        1.17±0ms         1.08±0ms     0.92  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'mean'), 'float')
-            191M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_int_float_str')
-      3.98±0.2μs       3.66±0.1μs     0.92  index_cached_properties.IndexCache.time_shape('CategoricalIndex')
-            184M             169M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df')
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df')
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_date_idx')
-        1.18±0ms         1.08±0ms     0.92  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'mean'), 'float')
-       122±0.7ms        112±0.6ms     0.92  strings.Split.time_rsplit('str', True)
-            184M             169M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_int_float_str')
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_int_floats')
-            183M             168M     0.91  io.json.ToJSON.peakmem_to_json('split', 'df_td_int_ts')
-            180M             165M     0.91  io.json.ToJSON.peakmem_to_json('values', 'df_td_int_ts')
-     1.81±0.03ms      1.65±0.01ms     0.91  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'sum')
-        834±40ns          761±5ns     0.91  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(1000000, 12000)
-      4.17±0.2μs       3.80±0.2μs     0.91  index_cached_properties.IndexCache.time_shape('UInt64Index')
-      70.6±0.7μs       64.4±0.6μs     0.91  timeseries.SortIndex.time_sort_index(True)
-      36.2±0.3ms       33.0±0.1ms     0.91  rolling.GroupbyLargeGroups.time_rolling_multiindex_creation
-      29.1±0.5ms       26.6±0.2ms     0.91  io.sql.SQL.time_read_sql_query('sqlite')
-      79.2±0.5μs       72.1±0.3μs     0.91  series_methods.ToFrame.time_to_frame('datetime64[ns]', None)
-        900±80ns         819±40ns     0.91  index_cached_properties.IndexCache.time_is_monotonic('RangeIndex')
-        835±40ns          759±3ns     0.91  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(10000, 12000)
-      79.2±0.3μs       71.9±0.3μs     0.91  series_methods.ToFrame.time_to_frame('datetime64[ns]', 'foo')
-      4.19±0.2μs       3.80±0.2μs     0.91  index_cached_properties.IndexCache.time_shape('TimedeltaIndex')
-         525±4μs          476±5μs     0.91  categoricals.Concat.time_concat_overlapping_index
-        88.1±1ms         79.7±3ms     0.90  frame_ctor.FromRecords.time_frame_from_records_generator(None)
-        801±40ns          724±4ns     0.90  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(1, 12000)
-      16.3±0.2ms       14.7±0.3ms     0.90  eval.Query.time_query_datetime_index
-         352±1μs          317±2μs     0.90  algos.isin.IsIn.time_isin_mismatched_dtype('object')
-     4.18±0.03ms      3.77±0.02ms     0.90  io.sas.SAS.time_read_sas('xport')
-      15.6±0.3ms       14.0±0.1ms     0.90  eval.Query.time_query_datetime_column
-         757±9μs          681±4μs     0.90  period.Indexing.time_align
-     2.26±0.09ms      2.03±0.07ms     0.90  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'count')
-        1.83±0ms      1.65±0.01ms     0.90  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'sum')
-        420±30ns          378±4ns     0.90  dtypes.DtypesInvalid.time_pandas_dtype_invalid('array-string')
-         993±2μs          893±7μs     0.90  libs.InferDtype.time_infer_dtype('np-object')
-     3.72±0.02ms      3.33±0.02ms     0.90  index_cached_properties.IndexCache.time_is_unique('IntervalIndex')
-         706±4μs          632±4μs     0.89  frame_ctor.FromDicts.time_dict_of_categoricals
-      1.72±0.1μs      1.54±0.07μs     0.89  index_cached_properties.IndexCache.time_inferred_type('DatetimeIndex')
-     1.91±0.02ms      1.70±0.01ms     0.89  io.csv.ReadCSVParseDates.time_baseline('c')
-         235±2ms          208±1ms     0.89  io.stata.StataMissing.time_write_stata('tw')
-         228±2ms          201±1ms     0.88  io.stata.StataMissing.time_write_stata('th')
-         230±6ms          203±1ms     0.88  io.stata.StataMissing.time_write_stata('tq')
-         218±3ms          192±4ms     0.88  io.stata.StataMissing.time_write_stata('td')
-     3.44±0.02ms      3.01±0.02ms     0.87  index_cached_properties.IndexCache.time_is_unique('UInt64Index')
-     3.44±0.02ms      3.01±0.02ms     0.87  index_cached_properties.IndexCache.time_is_unique('PeriodIndex')
-      3.70±0.2μs       3.22±0.2μs     0.87  index_cached_properties.IndexCache.time_inferred_type('TimedeltaIndex')
-      37.5±0.1μs       32.5±0.4μs     0.87  frame_ctor.FromSeries.time_mi_series
-         216±6ms          187±2ms     0.87  io.stata.StataMissing.time_write_stata('tc')
-         390±3μs          326±3μs     0.84  timeseries.ResetIndex.time_reset_datetimeindex(None)
-         395±2μs          329±3μs     0.83  timeseries.ResetIndex.time_reset_datetimeindex('US/Eastern')
-     9.26±0.09ms       7.65±0.7ms     0.83  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'sem')
-      9.26±0.1ms       7.60±0.7ms     0.82  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'sem')
-     22.4±0.09μs       18.3±0.1μs     0.82  frame_ctor.FromNDArray.time_frame_from_ndarray
-     19.5±0.07ms      15.8±0.03ms     0.81  strings.Cat.time_cat(0, ',', None, 0.15)
-     6.90±0.05ms       5.51±0.6ms     0.80  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'sem')
-        16.4±2ms      12.7±0.07ms     0.77  eval.Eval.time_mult('python', 'all')
-      3.47±0.1ms      2.58±0.01ms     0.75  frame_ctor.FromArrays.time_frame_from_arrays_float
-        17.5±3ms      12.6±0.08ms     0.72  eval.Eval.time_add('python', 'all')
-     4.36±0.03ms      2.99±0.01ms     0.69  frame_ctor.FromArrays.time_frame_from_arrays_int
-     4.47±0.01ms      3.04±0.01ms     0.68  frame_ctor.FromArrays.time_frame_from_arrays_sparse
-      27.4±0.4ms      17.1±0.09ms     0.62  indexing.InsertColumns.time_insert_middle
-     17.1±0.07ms       10.5±0.1ms     0.62  indexing.InsertColumns.time_insert
-     17.0±0.07ms      9.28±0.04ms     0.55  indexing.InsertColumns.time_assign_list_like_with_setitem
-      17.6±0.1ms      9.38±0.02ms     0.53  indexing.InsertColumns.time_assign_with_setitem
-         169±3μs         76.8±2μs     0.45  indexing.AssignTimeseriesIndex.time_frame_assign_timeseries_index
-      81.0±0.5μs       28.2±0.4μs     0.35  period.DataFramePeriodColumn.time_setitem_period_column
  • The pd.eval benchmarks using the numexpr engine show 5 to 10x slowdown. This seems to be due to the fact that our numexpr engine works on the full dataframe as one array (so effectively calling df.values for something like pd.eval("df1 + df2")). It is this df.values call that causes the slowdown, and we will probably need to refactor the numexpr engine to also be able to work column-by-column when dealing with dataframes.

  • The rolling.TableMethod.time_apply('table') shows a 6x slowdown, but uses a DataFrame of shape (10, 1000), so a very wide dataframe. When changing this to (1000, 10), there is no difference between both.

  • The SelectDtypes.time_select_dtype_... benchmarks show a ~2x slowdown, because now the dtype of every column instead of every block needs to be checked (i.e. more dtype checks). But for a DataFrame of 50 columns, we are still speaking of times around 50µs, so not something to worry about I think.

@jorisvandenbossche
Copy link
Member Author

All results combined

$ asv continuous -f 1.01 HEAD~1 HEAD
       before           after         ratio
     [f8052655]       [5815ddc3]
     <am-benchmarks2~1>       <am-benchmarks2>
+     3.18±0.04μs       11.5±0.1ms  3632.89  frame_methods.ToNumpy.time_values_wide
+     3.59±0.07μs      11.5±0.07ms  3193.82  frame_methods.ToNumpy.time_to_numpy_wide
+         210±1μs       80.0±0.6ms   381.47  reshape.ReshapeExtensionDtype.time_transpose('datetime64[ns, US/Pacific]')
+         508±4μs       99.7±0.5ms   196.07  frame_methods.Quantile.time_frame_quantile(1)
+     3.18±0.04μs          263±1μs    82.80  frame_methods.ToNumpy.time_values_tall
+     3.64±0.07μs        265±0.6μs    72.79  frame_methods.ToNumpy.time_to_numpy_tall
+      48.7±0.3μs       3.34±0.2ms    68.49  frame_methods.XS.time_frame_xs(0)
+     4.30±0.03ms          187±2ms    43.44  stat_ops.Correlation.time_corrwith_rows('pearson')
+      58.5±0.3μs      1.38±0.01ms    23.52  frame_methods.Dtypes.time_frame_dtypes
+     6.93±0.04ms        124±0.9ms    17.81  frame_methods.MaskBool.time_frame_mask_floats
+         977±5μs      14.3±0.04ms    14.64  frame_methods.GetDtypeCounts.time_frame_get_dtype_counts
+     6.10±0.04ms         87.1±2ms    14.28  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (1000, 10000))
+     4.01±0.06ms       54.9±0.5ms    13.71  groupby.GroupManyLabels.time_sum(1000)
+        6.71±1ms         75.1±4ms    11.20  eval.Eval.time_add('numexpr', 'all')
+        6.74±1ms         72.8±5ms    10.79  eval.Eval.time_mult('numexpr', 'all')
+     9.92±0.05ms        106±0.5ms    10.67  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000, 10000))
+         416±5μs       4.32±0.4ms    10.37  arithmetic.Ops2.time_frame_series_dot
+     12.9±0.03ms        119±0.6ms     9.16  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (1000, 10000))
+      11.3±0.2ms         96.3±2ms     8.49  eval.Eval.time_chained_cmp('numexpr', 'all')
+     1.15±0.03ms      9.37±0.09ms     8.15  arithmetic.Ops2.time_frame_float_div_by_zero
+      9.06±0.6ms         73.5±5ms     8.11  eval.Eval.time_mult('numexpr', 1)
+      9.01±0.6ms         73.1±5ms     8.11  eval.Eval.time_add('numexpr', 1)
+         662±8μs      5.31±0.06ms     8.03  frame_methods.Isnull.time_isnull_floats_no_null
+     35.6±0.07ms          285±3ms     8.01  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000, 10000))
+         664±6μs      5.28±0.05ms     7.96  frame_methods.Isnull.time_isnull
+     1.52±0.04ms      11.7±0.08ms     7.73  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('eq')
+     1.52±0.04ms      11.6±0.04ms     7.60  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ne')
+     1.54±0.05ms       11.7±0.1ms     7.58  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('gt')
+     1.54±0.04ms      11.6±0.05ms     7.51  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('le')
+     1.56±0.05ms       11.7±0.1ms     7.46  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('ge')
+     1.56±0.06ms      11.6±0.05ms     7.43  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('lt')
+        414±20μs       2.72±0.2ms     6.56  rolling.TableMethod.time_apply('table')
+        34.3±1ms          202±2ms     5.90  frame_methods.MaskBool.time_frame_mask_bools
+     1.82±0.01ms      10.5±0.07ms     5.78  arithmetic.Ops2.time_frame_int_div_by_zero
+     13.6±0.06ms       77.6±0.8ms     5.72  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (1000, 10000))
+      3.70±0.2ms       20.0±0.2ms     5.40  frame_methods.ToNumpy.time_to_numpy_mixed_wide
+      3.74±0.3ms       19.9±0.2ms     5.33  frame_methods.ToNumpy.time_values_mixed_wide
+         616±9μs      3.18±0.02ms     5.16  stat_ops.FrameOps.time_op('prod', 'int', 1)
+         590±4μs      2.92±0.01ms     4.94  stat_ops.FrameOps.time_op('sum', 'int', 1)
+     1.79±0.01ms      8.77±0.04ms     4.91  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('add')
+     1.83±0.03ms      8.81±0.03ms     4.83  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('sub')
+     20.5±0.08ms       96.0±0.4ms     4.68  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('pow')
+     2.82±0.02ms      13.2±0.07ms     4.67  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('truediv')
+      14.6±0.7ms         65.9±1ms     4.52  eval.Eval.time_and('numexpr', 'all')
+      21.5±0.2ms       97.3±0.5ms     4.52  frame_methods.Dropna.time_dropna('any', 1)
+     1.99±0.02ms      8.93±0.03ms     4.49  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('mul')
+      25.3±0.2ms        111±0.7ms     4.38  eval.Eval.time_chained_cmp('numexpr', 1)
+      2.39±0.1ms       10.4±0.2ms     4.36  frame_methods.Equals.time_frame_float_equal
+     44.5±0.09ms        184±0.5ms     4.14  reshape.Unstack.time_full_product('int')
+     1.79±0.03ms      7.32±0.03ms     4.09  reshape.ReshapeExtensionDtype.time_unstack_fast('datetime64[ns, US/Pacific]')
+     25.8±0.05ms       98.1±0.7ms     3.81  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('any', 1)
+     1.67±0.01ms      6.25±0.02ms     3.74  stat_ops.FrameOps.time_op('sum', 'float', 1)
+       112±0.7μs          382±2μs     3.41  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumsum', 'direct', 5)
+       113±0.5μs          384±3μs     3.39  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'direct', 5)
+       115±0.5μs          387±2μs     3.37  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'direct', 5)
+     1.85±0.01ms       6.05±0.3ms     3.26  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'datetime64[ns]')
+      57.2±0.4ms          184±2ms     3.22  frame_methods.Count.time_count_level_multi(1)
+     1.85±0.01ms       5.76±0.3ms     3.12  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'timedelta64[ns]')
+        19.4±7ms       60.6±0.3ms     3.12  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000, 10000))
+     3.59±0.03ms      11.2±0.04ms     3.10  reshape.SimpleReshape.time_stack
+      61.6±0.4ms        188±0.6ms     3.06  frame_methods.Count.time_count_level_multi(0)
+         344±4μs      1.01±0.02ms     2.93  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumprod', 'direct', 5)
+         349±3μs      1.02±0.01ms     2.91  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'direct', 5)
+         351±3μs      1.02±0.01ms     2.90  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'direct', 5)
+      15.9±0.1μs       45.2±0.4μs     2.85  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'int'>)
+      16.1±0.1μs       45.7±0.2μs     2.84  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'float'>)
+      15.9±0.2μs       45.1±0.4μs     2.84  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'int'>)
+      5.54±0.5ms       15.7±0.1ms     2.84  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('truediv')
+      16.0±0.1μs       45.4±0.4μs     2.84  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'float'>)
+     16.0±0.02μs       45.4±0.4μs     2.83  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'float'>)
+      16.0±0.2μs       45.2±0.4μs     2.82  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'int'>)
+         127±1μs        354±0.9μs     2.79  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummax', 'direct', 5)
+       126±0.6μs        350±0.9μs     2.78  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummin', 'direct', 5)
+         120±1μs          333±1μs     2.77  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'direct', 5)
+     9.77±0.07ms       27.0±0.4ms     2.76  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (10000, 1000))
+       129±0.8μs          356±1μs     2.75  groupby.GroupByMethods.time_dtype_as_group('int', 'cummax', 'direct', 5)
+       119±0.3μs          325±1μs     2.72  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'direct', 5)
+     9.34±0.05ms       25.4±0.3ms     2.72  frame_methods.Shift.time_shift(0)
+       129±0.7μs        349±0.8μs     2.71  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'direct', 5)
+         121±2μs        326±0.7μs     2.70  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'direct', 5)
+      72.6±0.5ms         196±10ms     2.70  frame_methods.Count.time_count_level_mixed_dtypes_multi(0)
+      11.0±0.7ms       29.5±0.5ms     2.69  io.hdf.HDFStoreDataFrame.time_read_store_table_wide
+         236±2μs          628±9μs     2.66  groupby.GroupByMethods.time_dtype_as_group('uint', 'var', 'direct', 5)
+     15.7±0.09μs       41.5±0.2μs     2.65  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'int'>)
+      43.0±0.2ms        114±0.5ms     2.65  frame_methods.Iteration.time_iteritems_indexing
+      15.8±0.1μs       41.6±0.4μs     2.64  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'float'>)
+         240±2μs          627±4μs     2.61  groupby.GroupByMethods.time_dtype_as_group('uint', 'mean', 'direct', 5)
+      5.42±0.5ms       14.2±0.1ms     2.61  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('sub')
+         240±1μs          623±2μs     2.60  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'direct', 5)
+      5.45±0.5ms      14.1±0.08ms     2.59  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('mul')
+      3.79±0.1ms       9.77±0.2ms     2.58  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'timedelta64[ns]')
+      42.8±0.4ms        110±0.7ms     2.58  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('all', 1)
+      25.3±0.4ms       65.3±0.3ms     2.58  frame_methods.Dropna.time_dropna('any', 0)
+         244±1μs          627±3μs     2.58  groupby.GroupByMethods.time_dtype_as_group('int', 'mean', 'direct', 5)
+     5.86±0.09ms       15.0±0.3ms     2.56  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function gt>, (10000, 1000))
+      3.78±0.1ms      9.67±0.01ms     2.56  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'datetime64[ns]')
+     33.1±0.07ms       84.4±0.8ms     2.55  eval.Eval.time_and('numexpr', 1)
+         240±2μs          608±5μs     2.54  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'direct', 5)
+     30.4±0.08ms       76.8±0.9ms     2.53  arithmetic.Ops2.time_frame_float_floor_by_zero
+         263±2μs          660±3μs     2.51  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct', 5)
+      3.75±0.1ms       9.19±0.2ms     2.45  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'timedelta64[ns]')
+      45.0±0.3ms        110±0.6ms     2.44  frame_methods.Dropna.time_dropna('all', 1)
+       113±0.8μs          275±3μs     2.42  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct', 5)
+     41.1±0.09ms       99.5±0.4ms     2.42  frame_methods.Reindex.time_reindex_axis1_missing
+      3.75±0.1ms      9.06±0.05ms     2.42  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'datetime64[ns]')
+       112±0.9μs          270±2μs     2.40  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'direct', 5)
+       108±0.4μs        258±0.4μs     2.39  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'direct', 5)
+     3.91±0.01ms      9.27±0.07ms     2.37  stat_ops.Correlation.time_corrwith_cols('pearson')
+       114±0.8μs          269±2μs     2.37  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct', 5)
+      28.5±0.4ms       67.5±0.2ms     2.36  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('any', 0)
+       114±0.3μs        267±0.6μs     2.35  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'direct', 5)
+        9.50±1ms         22.3±1ms     2.35  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('eq')
+       115±0.7μs          269±1μs     2.34  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct', 5)
+       182±0.9μs          426±3μs     2.34  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'direct', 5)
+        9.52±1ms         22.2±2ms     2.34  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ne')
+         116±1μs          271±2μs     2.34  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'direct', 5)
+         115±2μs          267±2μs     2.33  groupby.GroupByMethods.time_dtype_as_group('uint', 'all', 'direct', 5)
+        9.49±1ms         22.1±2ms     2.33  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('le')
+         111±1μs          257±2μs     2.33  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'direct', 5)
+        9.50±1ms         22.0±2ms     2.32  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('lt')
+        9.55±1ms         22.1±2ms     2.32  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('ge')
+         316±1μs          731±4μs     2.31  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'direct', 5)
+        9.56±1ms         22.0±2ms     2.30  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('gt')
+         116±1μs        268±0.9μs     2.30  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct', 5)
+     1.79±0.01ms       4.11±0.2ms     2.30  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function le>)
+      85.0±0.3ms         195±10ms     2.29  frame_methods.Count.time_count_level_mixed_dtypes_multi(1)
+         186±2μs          426±3μs     2.28  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'direct', 5)
+        1.81±0ms       4.13±0.2ms     2.28  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ge>)
+        35.9±3ms         81.5±1ms     2.27  join_merge.ConcatDataFrames.time_c_ordered(0, True)
+      3.06±0.2ms      6.94±0.06ms     2.27  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'timedelta64[ns]')
+     23.1±0.09μs       52.4±0.4μs     2.26  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'bool'>)
+        36.3±3ms         82.1±2ms     2.26  join_merge.ConcatDataFrames.time_c_ordered(0, False)
+     23.1±0.08μs       52.3±0.3μs     2.26  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'bool'>)
+      3.08±0.2ms       6.94±0.1ms     2.25  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'datetime64[ns]')
+     1.78±0.03ms       4.00±0.2ms     2.25  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ge>)
+      23.4±0.2μs       52.4±0.2μs     2.24  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'bool'>)
+      23.5±0.2μs       52.5±0.4μs     2.24  dtypes.SelectDtypes.time_select_dtype_string_include(<class 'complex'>)
+      23.5±0.1μs       52.5±0.3μs     2.23  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'complex'>)
+     23.5±0.09μs       52.5±0.1μs     2.23  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'complex'>)
+     1.28±0.01ms       2.85±0.2ms     2.23  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function lt>)
+     23.6±0.07μs       52.6±0.2μs     2.23  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'complex'>)
+     1.28±0.02ms       2.84±0.3ms     2.23  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function le>)
+       185±0.8μs          412±4μs     2.23  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'direct', 5)
+         355±1μs          789±9μs     2.23  groupby.GroupByMethods.time_dtype_as_group('uint', 'median', 'direct', 5)
+     1.81±0.02ms       3.99±0.2ms     2.21  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function le>)
+        97.8±2ms        216±0.4ms     2.21  reshape.Unstack.time_without_last_row('int')
+        6.41±1ms       14.1±0.1ms     2.20  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('add')
+         359±2μs          785±5μs     2.19  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'direct', 5)
+     1.90±0.01ms       4.15±0.1ms     2.18  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function eq>)
+     1.90±0.04ms       4.13±0.2ms     2.18  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function gt>)
+     1.93±0.03ms       4.14±0.2ms     2.15  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function lt>)
+        21.6±3ms       46.1±0.5ms     2.14  arithmetic.Ops.time_frame_multi_and(True, 'default')
+     1.28±0.01ms       2.74±0.2ms     2.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ge>)
+      26.3±0.1μs       56.3±0.4μs     2.14  dtypes.SelectDtypes.time_select_dtype_string_include('Int8')
+     1.88±0.01ms       3.99±0.2ms     2.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function eq>)
+     1.27±0.01ms       2.69±0.2ms     2.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function gt>)
+      26.5±0.1μs       56.0±0.3μs     2.11  dtypes.SelectDtypes.time_select_dtype_float_include('Int8')
+         975±4μs      2.06±0.01ms     2.11  stat_ops.FrameOps.time_op('mean', 'int', 1)
+     1.88±0.02ms       3.97±0.2ms     2.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function gt>)
+      26.6±0.1μs       55.9±0.2μs     2.10  dtypes.SelectDtypes.time_select_dtype_int_include('Int8')
+      26.7±0.1μs       56.1±0.4μs     2.10  dtypes.SelectDtypes.time_select_dtype_bool_include('Int8')
+         747±7μs      1.56±0.01ms     2.09  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'direct', 5)
+      23.3±0.2μs       48.7±0.1μs     2.09  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'bool'>)
+     1.89±0.02ms       3.96±0.2ms     2.09  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function lt>)
+      27.3±0.3μs       57.1±0.3μs     2.09  dtypes.SelectDtypes.time_select_dtype_float_include('Int16')
+      27.2±0.2μs       56.8±0.3μs     2.09  dtypes.SelectDtypes.time_select_dtype_string_include('Int16')
+     2.43±0.02ms      5.04±0.09ms     2.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mul>)
+      27.3±0.2μs       56.7±0.3μs     2.08  dtypes.SelectDtypes.time_select_dtype_bool_include('Int16')
+         746±8μs      1.55±0.01ms     2.08  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'direct', 5)
+      27.4±0.3μs       56.8±0.2μs     2.07  dtypes.SelectDtypes.time_select_dtype_int_include('Int16')
+      12.0±0.1ms       24.8±0.7ms     2.07  frame_methods.Iteration.time_items
+     1.26±0.02ms       2.60±0.1ms     2.06  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function ne>)
+      27.9±0.1μs       57.5±0.3μs     2.06  dtypes.SelectDtypes.time_select_dtype_int_include('Int32')
+         799±4μs      1.64±0.02ms     2.06  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'direct', 5)
+      28.0±0.1μs       57.6±0.2μs     2.06  dtypes.SelectDtypes.time_select_dtype_float_include('Int32')
+         766±4μs      1.57±0.02ms     2.05  groupby.GroupByMethods.time_dtype_as_group('uint', 'sum', 'direct', 5)
+     2.42±0.01ms       4.96±0.5ms     2.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function add>)
+      28.0±0.2μs       57.6±0.1μs     2.05  dtypes.SelectDtypes.time_select_dtype_string_include('Int32')
+     2.02±0.02ms       4.14±0.2ms     2.05  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function ne>)
+      28.1±0.3μs       57.5±0.3μs     2.05  dtypes.SelectDtypes.time_select_dtype_bool_include('Int32')
+         773±4μs      1.58±0.01ms     2.04  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'direct', 5)
+     2.81±0.01ms       5.73±0.1ms     2.04  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function truediv>)
+      28.8±0.4μs       58.7±0.5μs     2.04  dtypes.SelectDtypes.time_select_dtype_string_include('Int64')
+      28.9±0.4μs       58.8±0.4μs     2.03  dtypes.SelectDtypes.time_select_dtype_float_include('Int64')
+      28.8±0.4μs       58.5±0.3μs     2.03  dtypes.SelectDtypes.time_select_dtype_bool_include('Int64')
+      29.2±0.2μs       59.3±0.5μs     2.03  dtypes.SelectDtypes.time_select_dtype_int_include('UInt8')
+     2.42±0.01ms      4.91±0.06ms     2.02  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mul>)
+      33.3±0.6ms       67.4±0.9ms     2.02  groupby.GroupByCythonAgg.time_frame_agg('float64', 'prod')
+      29.7±0.1μs       60.0±0.6μs     2.02  dtypes.SelectDtypes.time_select_dtype_int_include('UInt16')
+      29.5±0.1μs       59.3±0.6μs     2.01  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt8')
+      29.9±0.1μs       60.0±0.3μs     2.01  dtypes.SelectDtypes.time_select_dtype_string_include('UInt16')
+      29.5±0.2μs       59.3±0.3μs     2.01  dtypes.SelectDtypes.time_select_dtype_float_include('UInt8')
+        2.42±0ms      4.85±0.06ms     2.00  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function add>)
+      29.6±0.2μs       59.1±0.2μs     2.00  dtypes.SelectDtypes.time_select_dtype_string_include('UInt8')
+      29.9±0.2μs       59.8±0.2μs     2.00  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt16')
+      29.9±0.1μs       59.7±0.3μs     2.00  dtypes.SelectDtypes.time_select_dtype_float_include('UInt16')
+     2.02±0.02ms       4.03±0.2ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function ne>)
+     1.36±0.01ms      2.70±0.08ms     1.99  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function le>)
+         825±5μs      1.64±0.02ms     1.99  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'direct', 5)
+      30.4±0.2μs       60.5±0.3μs     1.99  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt32')
+      30.5±0.1μs       60.6±0.2μs     1.99  dtypes.SelectDtypes.time_select_dtype_string_include('UInt32')
+     13.5±0.04ms       26.8±0.2ms     1.98  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function add>, (10000, 1000))
+     1.09±0.01ms      2.17±0.02ms     1.98  stat_ops.FrameOps.time_op('mean', 'float', 1)
+      30.7±0.2μs       60.7±0.3μs     1.98  dtypes.SelectDtypes.time_select_dtype_int_include('UInt32')
+     1.37±0.01ms      2.70±0.08ms     1.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ge>)
+     2.92±0.07ms      5.78±0.07ms     1.98  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function truediv>)
+        40.7±6ms         80.5±2ms     1.98  join_merge.ConcatDataFrames.time_f_ordered(0, True)
+     31.0±0.08μs       61.2±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_int_include('UInt64')
+     1.27±0.01ms      2.51±0.02ms     1.97  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function eq>)
+      41.5±0.5ms       81.9±0.4ms     1.97  frame_methods.Dropna.time_dropna('all', 0)
+      31.1±0.1μs       61.3±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_string_include('UInt64')
+     3.52±0.07ms      6.93±0.02ms     1.97  frame_methods.Reindex.time_reindex_axis0
+      30.7±0.1μs       60.5±0.3μs     1.97  dtypes.SelectDtypes.time_select_dtype_float_include('UInt32')
+     31.3±0.09μs       61.4±0.2μs     1.96  dtypes.SelectDtypes.time_select_dtype_float_include('UInt64')
+      31.4±0.2μs       61.6±0.5μs     1.96  dtypes.SelectDtypes.time_select_dtype_bool_include('UInt64')
+     2.78±0.02ms      5.45±0.07ms     1.96  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function truediv>)
+     2.42±0.01ms      4.73±0.07ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function sub>)
+        41.8±5ms         81.3±1ms     1.95  join_merge.ConcatDataFrames.time_f_ordered(0, False)
+     2.42±0.01ms       4.71±0.2ms     1.95  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function sub>)
+         516±3μs      1.00±0.03ms     1.94  frame_methods.Iteration.time_itertuples_start
+     4.56±0.05ms         8.86±3ms     1.94  gil.ParallelRolling.time_rolling('min')
+      28.5±0.3μs       54.8±0.3μs     1.92  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int64')
+     1.35±0.01ms       2.58±0.1ms     1.91  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ge>)
+        1.35±0ms       2.57±0.2ms     1.89  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function le>)
+         365±1μs         686±20μs     1.88  frame_methods.Iteration.time_itertuples_raw_start
+      33.4±0.7ms       62.6±0.8ms     1.88  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis0('floordiv')
+         366±2μs         686±10μs     1.87  frame_methods.Iteration.time_itertuples_raw_read_first
+     12.7±0.01ms      23.8±0.09ms     1.87  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (10000, 1000))
+         523±4μs         976±30μs     1.86  frame_methods.Iteration.time_itertuples_read_first
+        1.45±0ms      2.69±0.09ms     1.86  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function gt>)
+        1.45±0ms       2.68±0.1ms     1.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function eq>)
+     1.46±0.01ms      2.70±0.07ms     1.85  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function lt>)
+        13.4±3ms      24.8±0.08ms     1.84  groupby.Cumulative.time_frame_transform('int64', 'cumsum')
+      36.4±0.6ms       67.1±0.8ms     1.84  groupby.GroupByCythonAgg.time_frame_agg('float64', 'first')
+       212±0.7ns          389±4ns     1.84  attrs_caching.DataFrameAttributes.time_get_index
+      45.2±0.6ms         82.2±1ms     1.82  groupby.GroupByCythonAgg.time_frame_agg('float64', 'sum')
+      44.9±0.7ms       81.5±0.8ms     1.82  groupby.GroupByCythonAgg.time_frame_agg('float64', 'mean')
+     1.43±0.01ms       2.60±0.1ms     1.81  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function gt>)
+     6.39±0.08ms      11.6±0.03ms     1.81  timeseries.AsOf.time_asof_nan('DataFrame')
+     9.77±0.03ms      17.6±0.07ms     1.81  stat_ops.FrameOps.time_op('kurt', 'int', 1)
+     1.44±0.02ms       2.57±0.1ms     1.79  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function eq>)
+     6.60±0.06ms      11.8±0.02ms     1.78  timeseries.AsOf.time_asof('DataFrame')
+      44.4±0.7ms         79.1±2ms     1.78  groupby.GroupByCythonAgg.time_frame_agg('float64', 'var')
+      40.1±0.3μs         71.4±2μs     1.78  dtypes.SelectDtypes.time_select_dtype_int_include('int8')
+     35.7±0.09ms       63.3±0.4ms     1.77  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (10000, 1000))
+      40.4±0.2μs         71.6±2μs     1.77  dtypes.SelectDtypes.time_select_dtype_int_include('int16')
+     1.44±0.01ms       2.56±0.1ms     1.77  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function lt>)
+      39.8±0.2μs       70.1±0.2μs     1.76  dtypes.SelectDtypes.time_select_dtype_string_include('m8[ns]')
+     39.9±0.02μs       70.1±0.6μs     1.76  dtypes.SelectDtypes.time_select_dtype_string_include('M8[ns]')
+      40.0±0.2μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('m8[ns]')
+      40.0±0.3μs       70.2±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('M8[ns]')
+     40.1±0.08μs       70.3±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint16')
+     39.9±0.08μs       69.9±0.1μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('m8[ns]')
+      40.1±0.2μs       70.3±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('uint16')
+      40.0±0.2μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint64')
+      39.9±0.1μs       70.0±0.2μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('M8[ns]')
+         524±2μs          918±3μs     1.75  groupby.GroupByMethods.time_dtype_as_group('uint', 'min', 'direct', 5)
+      40.1±0.1μs       70.2±0.9μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('float64')
+     1.96±0.03ms      3.44±0.04ms     1.75  arithmetic.Ops.time_frame_comparison(True, 'default')
+      50.6±0.6ms         88.6±2ms     1.75  join_merge.ConcatDataFrames.time_f_ordered(1, False)
+      39.8±0.2μs       69.7±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int8')
+      40.1±0.4μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('m8[ns]')
+         537±1μs         940±20μs     1.75  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'direct', 5)
+      40.2±0.1μs       70.2±0.6μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('complex64')
+      40.0±0.2μs      69.8±0.09μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('float32')
+      39.9±0.3μs       69.7±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('bool')
+      40.6±0.1μs       70.8±0.1μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('timedelta64[ns]')
+      40.1±0.1μs       70.0±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('M8[ns]')
+      40.3±0.2μs       70.3±0.5μs     1.75  dtypes.SelectDtypes.time_select_dtype_float_include('uint32')
+      40.1±0.2μs       70.1±0.2μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int32')
+      40.0±0.1μs       69.9±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('int32')
+      40.2±0.2μs       70.1±0.4μs     1.75  dtypes.SelectDtypes.time_select_dtype_int_include('uint16')
+      40.0±0.2μs       69.9±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('complex128')
+     40.2±0.06μs       70.1±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_string_include('int64')
+      40.0±0.2μs       69.8±0.3μs     1.75  dtypes.SelectDtypes.time_select_dtype_bool_include('complex64')
+      40.1±0.3μs       69.9±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('uint8')
+      40.0±0.1μs       69.8±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_int_include('complex128')
+      40.1±0.5μs       70.0±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('uint8')
+      40.1±0.1μs       69.9±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('int64')
+         518±3μs         904±30μs     1.74  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'direct', 5)
+      40.2±0.1μs       70.1±0.1μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('float32')
+      40.1±0.1μs       69.9±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int64')
+      40.2±0.2μs       70.0±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('complex64')
+      40.2±0.3μs       70.2±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int32')
+      40.7±0.2μs       70.9±0.1μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('timedelta64[ns]')
+     40.0±0.09μs       69.7±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('float32')
+      39.9±0.1μs       69.5±0.4μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('bool')
+      40.2±0.2μs       69.9±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('float64')
+        26.2±2ms       45.6±0.6ms     1.74  arithmetic.Ops.time_frame_multi_and(False, 'default')
+       116±0.4μs          203±1μs     1.74  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct', 5)
+     40.1±0.06μs       69.8±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('complex128')
+      40.7±0.2μs       70.8±0.2μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('timedelta64[ns]')
+      40.4±0.3μs       70.2±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('float32')
+      40.2±0.2μs       69.8±0.7μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('uint64')
+      40.2±0.1μs       69.8±0.3μs     1.74  dtypes.SelectDtypes.time_select_dtype_float_include('int8')
+      40.1±0.1μs       69.7±0.6μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('float64')
+      40.3±0.2μs       69.9±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_int_include('uint32')
+         456±2μs          792±6μs     1.74  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct', 5)
+      40.2±0.1μs       69.8±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_bool_include('uint16')
+        26.5±2ms       46.0±0.2ms     1.74  arithmetic.Ops.time_frame_multi_and(False, 1)
+     39.9±0.07μs       69.3±0.5μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('bool')
+      40.3±0.4μs       70.0±0.4μs     1.74  dtypes.SelectDtypes.time_select_dtype_string_include('int16')
+      40.8±0.2μs       70.7±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('timedelta64[ns]')
+      40.1±0.2μs       69.6±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('complex64')
+      40.2±0.2μs       69.8±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('uint64')
+      40.3±0.5μs       69.9±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_string_include('uint32')
+      40.4±0.3μs       70.0±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_float_include('int16')
+      40.2±0.1μs       69.7±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int32')
+      40.2±0.4μs       69.7±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('uint64')
+      40.3±0.5μs       69.8±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int16')
+      41.1±0.2μs       71.1±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_int_include('datetime64[ns]')
+      41.0±0.3μs       70.9±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_string_include('datetime64[ns]')
+     11.4±0.09ms      19.8±0.04ms     1.73  stat_ops.FrameOps.time_op('skew', 'int', 1)
+      40.3±0.5μs       69.7±0.4μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('int8')
+      40.4±0.1μs       69.9±0.5μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('complex128')
+         515±9μs         891±70μs     1.73  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'direct', 5)
+      40.4±0.3μs       69.8±0.3μs     1.73  dtypes.SelectDtypes.time_select_dtype_bool_include('uint32')
+     1.57±0.01ms      2.72±0.06ms     1.73  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function ne>)
+      41.1±0.3μs       71.0±0.2μs     1.72  dtypes.SelectDtypes.time_select_dtype_float_include('datetime64[ns]')
+         534±2μs         921±20μs     1.72  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'direct', 5)
+      40.5±0.4μs       69.7±0.4μs     1.72  dtypes.SelectDtypes.time_select_dtype_int_include('uint8')
+      40.6±0.3μs       69.9±0.5μs     1.72  dtypes.SelectDtypes.time_select_dtype_bool_include('uint8')
+         532±1μs          915±4μs     1.72  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'direct', 5)
+       523±0.9μs          900±4μs     1.72  groupby.GroupByMethods.time_dtype_as_group('int', 'first', 'direct', 5)
+         537±2μs          924±7μs     1.72  groupby.GroupByMethods.time_dtype_as_group('int', 'max', 'direct', 5)
+     3.86±0.05ms      6.63±0.08ms     1.72  stat_ops.FrameOps.time_op('mad', 'int', 1)
+      41.4±0.2μs       71.0±0.4μs     1.72  dtypes.SelectDtypes.time_select_dtype_bool_include('datetime64[ns]')
+        51.0±4ms         87.6±2ms     1.72  join_merge.ConcatDataFrames.time_f_ordered(1, True)
+     1.43±0.01ms      2.46±0.01ms     1.71  stat_ops.FrameOps.time_op('var', 'int', 1)
+         526±9μs          900±8μs     1.71  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'direct', 5)
+      20.9±0.1ms       35.8±0.5ms     1.71  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function pow>)
+         544±3μs          931±6μs     1.71  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct', 5)
+     20.9±0.03ms       35.7±0.2ms     1.71  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function pow>)
+      47.2±0.7μs       80.5±0.6μs     1.71  replace.ReplaceList.time_replace_list(True)
+       538±0.8μs          915±4μs     1.70  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct', 5)
+         457±2μs          777±5μs     1.70  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'direct', 5)
+         539±4μs          915±7μs     1.70  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'direct', 5)
+        86.8±1ms          147±1ms     1.70  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'direct', 5)
+         516±2μs          874±7μs     1.69  groupby.GroupByMethods.time_dtype_as_group('uint', 'last', 'direct', 5)
+         533±2μs          897±9μs     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'direct', 5)
+      56.8±0.3ms       95.7±0.5ms     1.68  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'direct', 5)
+        88.2±1ms          148±1ms     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'transformation', 5)
+     3.27±0.06ms       5.49±0.1ms     1.68  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function truediv>)
+         536±4μs          901±5μs     1.68  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct', 5)
+      56.6±0.3ms         95.0±1ms     1.68  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'direct', 5)
+     2.03±0.04ms      3.39±0.04ms     1.67  arithmetic.Ops.time_frame_comparison(False, 'default')
+         519±4μs          866±9μs     1.67  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct', 5)
+     2.03±0.02ms      3.39±0.03ms     1.67  arithmetic.Ops.time_frame_comparison(False, 1)
+     1.70±0.01ms      2.83±0.07ms     1.67  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function le>)
+     1.57±0.01ms      2.61±0.02ms     1.67  stat_ops.FrameOps.time_op('var', 'float', 1)
+      58.1±0.5ms       96.7±0.4ms     1.67  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'transformation', 5)
+      58.0±0.3ms       96.6±0.3ms     1.66  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'transformation', 5)
+     1.71±0.01ms       2.85±0.1ms     1.66  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function gt>)
+     1.71±0.01ms       2.83±0.1ms     1.66  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function lt>)
+      51.8±0.2ms       85.9±0.5ms     1.66  frame_methods.Dropna.time_dropna_axis_mixed_dtypes('all', 0)
+     5.82±0.07ms      9.65±0.04ms     1.66  reshape.ReshapeExtensionDtype.time_stack('datetime64[ns, US/Pacific]')
+     12.9±0.03ms         21.4±3ms     1.65  indexing.ChainIndexing.time_chained_indexing(None)
+      40.1±0.2μs       66.0±0.4μs     1.65  dtypes.SelectDtypes.time_select_dtype_int_exclude('int64')
+      40.3±0.4μs       66.3±0.5μs     1.65  dtypes.SelectDtypes.time_select_dtype_float_exclude('float64')
+         545±2ms          894±8ms     1.64  io.csv.ToCSVDatetimeBig.time_frame(100000)
+      40.2±0.3μs       65.9±0.3μs     1.64  dtypes.SelectDtypes.time_select_dtype_bool_exclude('bool')
+        28.2±2ms       46.2±0.5ms     1.64  arithmetic.Ops.time_frame_multi_and(True, 1)
+        50.1±2ms         81.9±1ms     1.64  groupby.GroupByCythonAgg.time_frame_agg('float64', 'any')
+      47.2±0.8ms       77.2±0.4ms     1.64  replace.Convert.time_replace('DataFrame', 'Timedelta')
+         727±9μs      1.19±0.04ms     1.64  frame_methods.Iteration.time_items_cached
+     1.25±0.02ms      2.04±0.03ms     1.64  timeseries.ResampleDataFrame.time_method('mean')
+        1.56±0ms       2.55±0.1ms     1.63  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function ne>)
+     1.72±0.01ms      2.80±0.09ms     1.63  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ge>)
+     3.25±0.02μs       5.28±0.5μs     1.62  frame_methods.XS.time_frame_xs(1)
+      11.1±0.1ms         18.0±3ms     1.62  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (100000, 100))
+         353±6μs          572±5μs     1.62  frame_methods.Quantile.time_frame_quantile(0)
+      47.9±0.7ms       77.1±0.4ms     1.61  replace.Convert.time_replace('DataFrame', 'Timestamp')
+     6.11±0.04ms      9.83±0.03ms     1.61  io.csv.ToCSVDatetimeBig.time_frame(1000)
+        51.0±2ms         81.9±1ms     1.61  groupby.GroupByCythonAgg.time_frame_agg('float64', 'all')
+     1.71±0.02ms       2.75±0.1ms     1.61  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function eq>)
+      55.4±0.4ms       88.9±0.2ms     1.61  io.csv.ToCSVDatetimeBig.time_frame(10000)
+      8.93±0.3ms       14.3±0.1ms     1.60  eval.Eval.time_chained_cmp('python', 'all')
+     1.71±0.01ms      2.73±0.02ms     1.60  stat_ops.FrameOps.time_op('std', 'int', 1)
+      40.4±0.5ms       64.5±0.7ms     1.60  groupby.GroupByCythonAgg.time_frame_agg('float64', 'last')
+       253±0.7ms        404±0.6ms     1.60  join_merge.Merge.time_merge_dataframes_cross(True)
+     1.71±0.01ms       2.73±0.1ms     1.59  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function ne>)
+         254±2ms        403±0.5ms     1.59  join_merge.Merge.time_merge_dataframes_cross(False)
+     4.65±0.06ms      7.36±0.04ms     1.58  stat_ops.FrameOps.time_op('sem', 'float', 1)
+     1.70±0.01ms       2.66±0.1ms     1.56  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function le>)
+         132±1μs          207±1μs     1.56  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct', 5)
+       131±0.6μs          203±2μs     1.56  groupby.GroupByMethods.time_dtype_as_group('uint', 'count', 'direct', 5)
+     4.05±0.03ms         6.28±0ms     1.55  stat_ops.FrameOps.time_op('prod', 'float', 1)
+     1.70±0.01ms       2.63±0.1ms     1.55  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ge>)
+     1.93±0.01ms      2.97±0.02ms     1.54  stat_ops.FrameOps.time_op('std', 'float', 1)
+         136±1μs          209±1μs     1.54  groupby.GroupByMethods.time_dtype_as_group('float', 'count', 'direct', 5)
+      6.49±0.2ms      9.98±0.03ms     1.54  frame_methods.Reindex.time_reindex_upcast
+     1.79±0.02ms      2.75±0.07ms     1.54  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function le>)
+       128±0.6μs        197±0.9μs     1.53  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct', 5)
+     8.17±0.04ms      12.5±0.03ms     1.53  join_merge.Concat.time_concat_small_frames(1)
+     2.45±0.02ms      3.73±0.07ms     1.53  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function truediv>)
+     1.81±0.01ms      2.75±0.06ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ge>)
+     2.36±0.01ms      3.59±0.05ms     1.52  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mul>)
+     5.56±0.02ms      8.43±0.02ms     1.52  stat_ops.FrameMultiIndexOps.time_op(0, 'std')
+     5.68±0.06ms      8.57±0.04ms     1.51  stat_ops.FrameMultiIndexOps.time_op(0, 'var')
+     2.43±0.02ms      3.65±0.06ms     1.50  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function truediv>)
+     1.54±0.03ms      2.31±0.02ms     1.50  timeseries.AsOf.time_asof_nan_single('DataFrame')
+      47.3±0.7ms       71.0±0.6ms     1.50  groupby.GroupByCythonAgg.time_frame_agg('float64', 'min')
+     11.6±0.05ms       17.3±0.1ms     1.50  eval.Eval.time_and('python', 'all')
+      47.5±0.7ms         71.1±1ms     1.50  groupby.GroupByCythonAgg.time_frame_agg('float64', 'max')
+      17.1±0.2ms       25.5±0.3ms     1.49  indexing.ChainIndexing.time_chained_indexing('warn')
+     1.04±0.01ms       1.55±0.3ms     1.49  series_methods.NanOps.time_func('sum', 1000000, 'int8')
+      27.6±0.6ms      40.6±0.05ms     1.47  arithmetic.Ops2.time_frame_dot
+         399±3ms        587±0.9ms     1.47  join_merge.MergeCategoricals.time_merge_object
+     5.76±0.02ms      8.48±0.05ms     1.47  stat_ops.FrameMultiIndexOps.time_op(1, 'var')
+     9.86±0.07ms       14.5±0.3ms     1.47  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function gt>, (1000000, 10))
+         518±1ms          761±4ms     1.47  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'skew')
+     5.71±0.06ms      8.37±0.08ms     1.47  stat_ops.FrameMultiIndexOps.time_op(1, 'std')
+     2.36±0.02ms      3.46±0.03ms     1.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mul>)
+     2.36±0.01ms      3.45±0.06ms     1.47  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function add>)
+      4.45±0.2ms       6.53±0.1ms     1.46  stat_ops.FrameOps.time_op('mad', 'float', 1)
+     1.90±0.02ms      2.78±0.08ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function gt>)
+     2.36±0.02ms      3.45±0.03ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function pow>)
+     2.36±0.01ms      3.44±0.02ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function sub>)
+     2.34±0.01ms      3.41±0.04ms     1.46  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function add>)
+     2.36±0.01ms      3.44±0.06ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function sub>)
+     2.42±0.01ms      3.51±0.07ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function truediv>)
+     1.90±0.01ms      2.76±0.08ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function eq>)
+     1.88±0.02ms      2.73±0.07ms     1.45  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function lt>)
+        15.9±3ms      22.9±0.05ms     1.44  groupby.Cumulative.time_frame_transform('int64', 'cummin')
+        14.2±2ms      20.6±0.04ms     1.44  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cumsum')
+      7.73±0.6ms       11.1±0.1ms     1.44  frame_methods.Equals.time_frame_float_unequal
+     1.85±0.01ms       2.66±0.1ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function gt>)
+      14.4±0.9ms       20.6±0.1ms     1.43  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cumsum')
+        16.0±2ms      22.8±0.06ms     1.43  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cummin')
+     1.85±0.01ms       2.63±0.1ms     1.43  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function eq>)
+      16.1±0.9ms       22.9±0.3ms     1.42  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cummin')
+         176±2ms          250±1ms     1.42  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'direct', 5)
+      17.4±0.9ms       24.7±0.1ms     1.42  groupby.Cumulative.time_frame_transform('float64', 'cummin')
+        16.8±3ms      23.8±0.08ms     1.42  groupby.Cumulative.time_frame_transform('int64', 'cummax')
+     1.85±0.02ms       2.61±0.1ms     1.41  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function lt>)
+         177±2ms          251±2ms     1.41  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'transformation', 5)
+         114±1ms        161±0.8ms     1.41  groupby.GroupByMethods.time_dtype_as_group('uint', 'mad', 'direct', 5)
+        26.2±1ms       37.0±0.4ms     1.41  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('pow')
+     2.36±0.01ms      3.32±0.05ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mul>)
+     2.37±0.01ms      3.32±0.03ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mul>)
+        16.3±3ms      22.9±0.04ms     1.40  groupby.Cumulative.time_frame_transform_many_nulls('int64', 'cummax')
+     2.37±0.01ms      3.32±0.04ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function sub>)
+         116±1ms        162±0.9ms     1.40  groupby.GroupByMethods.time_dtype_as_group('uint', 'mad', 'transformation', 5)
+         114±1ms          160±1ms     1.40  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'direct', 5)
+         116±1ms        163±0.7ms     1.40  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'transformation', 5)
+        734±40μs      1.03±0.09ms     1.40  reindex.LevelAlign.time_align_level
+     2.37±0.02ms      3.30±0.04ms     1.40  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function sub>)
+     13.1±0.06ms      18.2±0.08ms     1.40  io.hdf.HDFStoreDataFrame.time_query_store_table_wide
+     2.60±0.03ms      3.62±0.04ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function truediv>)
+        49.3±3ms       68.6±0.6ms     1.39  frame_methods.Equals.time_frame_object_unequal
+     2.36±0.01ms      3.28±0.06ms     1.39  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mul>)
+      16.6±0.9ms      23.0±0.04ms     1.39  groupby.Cumulative.time_frame_transform_many_nulls('float64', 'cummax')
+       240±0.4μs          333±2μs     1.39  stat_ops.Correlation.time_corr('pearson')
+     2.38±0.02ms      3.29±0.03ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function sub>)
+      15.9±0.8ms      21.9±0.06ms     1.38  groupby.Cumulative.time_frame_transform('float64', 'cumsum')
+      32.0±0.3μs       44.1±0.4μs     1.38  frame_methods.GetNumericData.time_frame_get_numeric_data
+     2.37±0.01ms      3.26±0.04ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function add>)
+     2.00±0.02ms      2.76±0.09ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function ne>)
+        3.39±0ms      4.67±0.06ms     1.38  timeseries.ResampleSeries.time_resample('datetime', '5min', 'ohlc')
+     2.36±0.01ms      3.25±0.04ms     1.38  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function add>)
+         116±1μs          159±3μs     1.37  indexing.IndexSingleRow.time_iloc_row(True)
+     2.38±0.01ms      3.26±0.03ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function add>)
+     2.38±0.01ms      3.25±0.04ms     1.37  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mul>)
+        1.57±0μs      2.13±0.03μs     1.36  indexing.GetItemSingleColumn.time_frame_getitem_single_column_label
+     5.66±0.03ms      7.69±0.04ms     1.36  stat_ops.FrameMultiIndexOps.time_op(0, 'mean')
+     3.39±0.03ms      4.59±0.03ms     1.36  timeseries.ResampleSeries.time_resample('period', '5min', 'ohlc')
+        742±30μs      1.00±0.09ms     1.35  reindex.LevelAlign.time_reindex_level
+        1.47±0ms       1.99±0.3ms     1.35  series_methods.NanOps.time_func('prod', 1000000, 'int8')
+     5.70±0.01ms      7.67±0.01ms     1.35  stat_ops.FrameMultiIndexOps.time_op(0, 'sum')
+        1.20±0ms      1.60±0.01ms     1.34  reindex.ReindexMethod.time_reindex_method('pad', <function date_range at 0x7ff1b5af8820>)
+     1.97±0.02ms       2.64±0.1ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function ne>)
+      18.8±0.7ms      25.2±0.07ms     1.34  groupby.Cumulative.time_frame_transform('float64', 'cummax')
+     1.78±0.01ms      2.39±0.03ms     1.34  timeseries.AsOf.time_asof_single('DataFrame')
+     41.8±0.03ms       56.0±0.7ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function pow>)
+     41.6±0.05ms       55.7±0.3ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function pow>)
+     41.7±0.02ms       55.7±0.3ms     1.34  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function pow>)
+      69.6±0.2ms       92.9±0.4ms     1.34  frame_methods.Repr.time_frame_repr_wide
+     2.91±0.02ms      3.88±0.05ms     1.33  arithmetic.Ops.time_frame_add(False, 'default')
+      9.07±0.4ms       12.1±0.3ms     1.33  join_merge.Join.time_join_dataframe_index_single_key_small(True)
+         848±9ms       1.13±0.03s     1.33  groupby.String.time_str_func('string[python]', 'any')
+      66.7±0.5ms         88.5±1ms     1.33  stat_ops.FrameMultiIndexOps.time_op(1, 'skew')
+        848±10ms       1.13±0.03s     1.33  groupby.String.time_str_func('string[python]', 'all')
+     1.28±0.02ms      1.69±0.02ms     1.33  reindex.ReindexMethod.time_reindex_method('pad', <function period_range at 0x7ff1b5acb670>)
+     2.37±0.02ms      3.14±0.05ms     1.32  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function sub>)
+     5.83±0.03ms      7.70±0.06ms     1.32  stat_ops.FrameMultiIndexOps.time_op(1, 'sum')
+      11.3±0.2ms       14.9±0.2ms     1.32  join_merge.Join.time_join_dataframe_index_single_key_bigger(True)
+      2.92±0.2ms      3.85±0.03ms     1.32  arithmetic.Ops.time_frame_mult(False, 'default')
+     37.0±0.05ms       48.7±0.3ms     1.32  frame_methods.Equals.time_frame_nonunique_equal
+      11.3±0.2ms       14.8±0.4ms     1.32  join_merge.Join.time_join_dataframe_index_shuffle_key_bigger_sort(True)
+     37.2±0.05ms       49.0±0.1ms     1.32  frame_methods.Equals.time_frame_nonunique_unequal
+      37.3±0.4ms       49.0±0.1ms     1.31  arithmetic.Ops2.time_frame_float_div
+     5.81±0.03ms      7.62±0.03ms     1.31  stat_ops.FrameMultiIndexOps.time_op(1, 'mean')
+     2.37±0.02ms      3.10±0.04ms     1.31  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function add>)
+     1.83±0.01ms      2.38±0.02ms     1.30  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'transformation', 5)
+         125±2μs          163±4μs     1.30  indexing.IndexSingleRow.time_loc_row(True)
+     2.95±0.03ms      3.84±0.05ms     1.30  arithmetic.Ops.time_frame_mult(False, 1)
+     1.74±0.01ms      2.27±0.01ms     1.30  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumprod', 'transformation', 5)
+         115±1μs          149±4μs     1.30  indexing.IndexSingleRow.time_iloc_row(False)
+     1.77±0.01μs      2.30±0.03μs     1.30  indexing.GetItemSingleColumn.time_frame_getitem_single_column_int
+      2.98±0.1ms      3.87±0.03ms     1.30  arithmetic.Ops.time_frame_add(False, 1)
+     2.31±0.02ms      2.99±0.03ms     1.29  groupby.GroupByMethods.time_dtype_as_group('uint', 'sum', 'transformation', 5)
+     1.77±0.01ms      2.28±0.01ms     1.29  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'transformation', 5)
+       143±0.9μs          185±2μs     1.29  indexing.DataFrameStringIndexing.time_boolean_rows
+     3.71±0.03ms      4.79±0.06ms     1.29  stat_ops.FrameOps.time_op('sem', 'int', 1)
+         148±1μs          191±2μs     1.29  indexing.DataFrameStringIndexing.time_boolean_rows_boolean
+     4.74±0.05ms      6.09±0.03ms     1.29  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'float32')
+     2.29±0.02ms      2.95±0.03ms     1.28  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'transformation', 5)
+      1.01±0.01s       1.29±0.03s     1.28  groupby.String.time_str_func('string[python]', 'first')
+      1.02±0.01s       1.31±0.02s     1.28  groupby.String.time_str_func('string[python]', 'last')
+         124±2μs          159±2μs     1.28  indexing.IndexSingleRow.time_loc_row(False)
+         606±2μs          775±7μs     1.28  groupby.Datelike.time_sum('date_range')
+      22.2±0.2ms       28.4±0.1ms     1.28  groupby.Cumulative.time_frame_transform('Int64', 'cummax')
+     22.0±0.05ms      28.1±0.09ms     1.28  groupby.Cumulative.time_frame_transform('Int64', 'cummin')
+      40.2±0.4ms       51.2±0.3ms     1.27  reshape.ReshapeExtensionDtype.time_transpose('Period[s]')
+     5.37±0.06ms      6.81±0.04ms     1.27  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'float64')
+         208±1ms          262±2ms     1.26  frame_methods.GetDtypeCounts.time_info
+     2.33±0.01ms      2.94±0.02ms     1.26  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'transformation', 5)
+         190±1μs        240±0.7μs     1.26  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+     3.82±0.01ms      4.81±0.02ms     1.26  stat_ops.FrameOps.time_op('median', 'int', 1)
+     10.8±0.06ms       13.6±0.3ms     1.26  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function pow>)
+      9.02±0.1ms      11.3±0.03ms     1.26  stat_ops.FrameMultiIndexOps.time_op(1, 'sem')
+     2.46±0.02ms      3.10±0.03ms     1.26  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'transformation', 5)
+     2.35±0.02ms      2.95±0.02ms     1.26  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'transformation', 5)
+         248±3ms          311±1ms     1.25  frame_methods.Iteration.time_iterrows
+     1.36±0.02ms      1.71±0.01ms     1.25  reindex.ReindexMethod.time_reindex_method('backfill', <function period_range at 0x7ff1b5acb670>)
+     9.19±0.04ms      11.5±0.03ms     1.25  stat_ops.FrameMultiIndexOps.time_op(0, 'sem')
+         643±3μs          803±4μs     1.25  groupby.Datelike.time_sum('date_range_tz')
+         193±3μs          240±3μs     1.25  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 1000000)
+     1.97±0.02ms      2.46±0.02ms     1.25  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct', 5)
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw_read_first
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_raw_start
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples
+            328M             409M     1.25  frame_methods.Iteration.peakmem_itertuples_start
+     2.48±0.03ms      3.10±0.02ms     1.25  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'transformation', 5)
+     1.97±0.04ms      2.45±0.03ms     1.25  groupby.GroupByMethods.time_dtype_as_group('uint', 'sem', 'direct', 5)
+       110±0.9μs        137±0.4μs     1.24  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 500000)
+      21.5±0.2μs       26.5±0.2μs     1.24  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+        1.68±0ms      2.07±0.01ms     1.23  timeseries.ResampleDataFrame.time_method('max')
+      21.2±0.2μs       26.2±0.3μs     1.23  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'nonunique_monotonic_inc')
+     1.98±0.02ms      2.44±0.02ms     1.23  reshape.SimpleReshape.time_unstack
+     4.59±0.02ms      5.65±0.02ms     1.23  stat_ops.FrameOps.time_op('median', 'float', 1)
+         978±8ms          1.20±0s     1.23  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'mad')
+      44.3±0.1μs       54.4±0.3μs     1.23  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'int'>)
+     21.4±0.07μs       26.3±0.3μs     1.23  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         181±1μs          223±2μs     1.23  indexing.DataFrameStringIndexing.time_boolean_rows_object
+      44.2±0.2μs       54.3±0.4μs     1.23  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'int'>)
+      44.1±0.2μs       54.1±0.3μs     1.23  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'int'>)
+     1.32±0.02ms      1.61±0.03ms     1.23  reindex.ReindexMethod.time_reindex_method('backfill', <function date_range at 0x7ff1b5af8820>)
+      21.3±0.2μs       26.0±0.1μs     1.22  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'nonunique_monotonic_inc')
+     2.04±0.02ms      2.49±0.01ms     1.22  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct', 5)
+        1.15±0ms         1.41±0ms     1.22  groupby.GroupByMethods.time_dtype_as_group('object', 'rank', 'direct', 5)
+      32.3±0.2ms      39.2±0.08ms     1.21  arithmetic.Ops2.time_frame_float_mod
+      21.3±0.2μs       25.9±0.2μs     1.21  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+      45.1±0.4μs       54.6±0.4μs     1.21  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'float'>)
+     4.10±0.01ms       4.96±0.1ms     1.21  stat_ops.Correlation.time_corr_wide('pearson')
+      45.2±0.6μs       54.7±0.4μs     1.21  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'float'>)
+      37.0±0.5μs       44.8±0.4μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'nonunique_monotonic_inc')
+      9.87±0.3ms       11.9±0.3ms     1.21  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'std')
+      37.1±0.4μs       44.9±0.2μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'unique_monotonic_inc')
+      37.0±0.2μs       44.8±0.3μs     1.21  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('string', 'non_monotonic')
+      10.0±0.2ms       12.1±0.3ms     1.21  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'var')
+     3.31±0.02ms      3.98±0.03ms     1.20  arithmetic.Ops.time_frame_add(True, 1)
+     9.33±0.03ms       11.2±0.1ms     1.20  join_merge.Concat.time_concat_small_frames(0)
+      21.4±0.2μs       25.8±0.2μs     1.20  indexing.NumericSeriesIndexing.time_iloc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+      45.4±0.7μs       54.4±0.5μs     1.20  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'float'>)
+     5.18±0.04ms      6.21±0.04ms     1.20  stat_ops.FrameMultiIndexOps.time_op(0, 'prod')
+     1.66±0.01ms      1.99±0.01ms     1.20  timeseries.ResampleDataFrame.time_method('min')
+      26.6±0.3μs       31.8±0.1μs     1.20  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'nonunique_monotonic_inc')
+      47.5±0.5μs       56.8±0.1μs     1.20  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 100000)
+      35.8±0.2μs      42.8±0.09μs     1.20  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 10000)
+      49.9±0.1μs       59.6±0.1μs     1.19  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('string', 'unique_monotonic_inc')
+      47.4±0.5μs       56.6±0.9μs     1.19  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 100000)
+      7.66±0.2ms      9.10±0.02ms     1.19  frame_methods.Reindex.time_reindex_both_axes
+     2.14±0.03μs      2.55±0.02μs     1.19  attrs_caching.DataFrameAttributes.time_set_index
+         552±5ns          658±9ns     1.19  attrs_caching.SeriesArrayAttribute.time_array('datetime64tz')
+        555±10ns          661±8ns     1.19  attrs_caching.SeriesArrayAttribute.time_array('category')
+       112±0.8ms        133±0.7ms     1.19  stat_ops.FrameMultiIndexOps.time_op(1, 'mad')
+     5.17±0.03ms      6.15±0.03ms     1.19  stat_ops.FrameMultiIndexOps.time_op(1, 'prod')
+      41.5±0.1μs       49.4±0.2μs     1.19  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+      61.6±0.3ms         73.2±1ms     1.19  io.style.Render.time_tooltips_render(24, 120)
+      32.9±0.3μs       39.0±0.2μs     1.18  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'non_monotonic')
+     1.72±0.03ms       2.04±0.1ms     1.18  groupby.GroupByMethods.time_dtype_as_group('datetime', 'quantile', 'direct', 5)
+      43.9±0.1μs       52.0±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         210±2μs          249±1μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+      26.8±0.2μs       31.7±0.3μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+      36.5±0.4μs       43.1±0.2μs     1.18  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 10000)
+      26.8±0.1μs       31.6±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'nonunique_monotonic_inc')
+      43.2±0.2ms       51.0±0.2ms     1.18  frame_methods.Isnull.time_isnull_obj
+      26.7±0.1μs       31.5±0.2μs     1.18  indexing.NumericSeriesIndexing.time_getitem_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+     2.96±0.03ms      3.48±0.03ms     1.18  arithmetic.Ops.time_frame_comparison(True, 1)
+      33.0±0.8μs      38.8±0.07μs     1.18  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'nonunique_monotonic_inc')
+     4.58±0.03μs      5.38±0.05μs     1.18  indexing.DataFrameStringIndexing.time_getitem_scalar
+      38.5±0.2μs       45.2±0.5μs     1.17  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'unique_monotonic_inc')
+     3.64±0.04ms      4.27±0.02ms     1.17  stat_ops.FrameOps.time_op('mad', 'int', 0)
+      87.8±0.5ms        103±0.8ms     1.17  io.style.Render.time_tooltips_render(36, 120)
+     4.68±0.03ms      5.49±0.02ms     1.17  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'float32')
+     7.19±0.05μs      8.40±0.07μs     1.17  indexing.DataFrameStringIndexing.time_loc
+      49.8±0.3μs       58.1±0.5μs     1.17  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 'unique_monotonic_inc')
+        1.65±0ms      1.92±0.01ms     1.17  groupby.GroupByMethods.time_dtype_as_group('int', 'quantile', 'direct', 5)
+     1.92±0.01ms      2.23±0.02ms     1.16  groupby.GroupByMethods.time_dtype_as_group('uint', 'median', 'transformation', 5)
+      39.2±0.6μs       45.5±0.8μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'non_monotonic')
+      61.4±0.2μs       71.1±0.1μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('string', 'nonunique_monotonic_inc')
+      33.3±0.5μs       38.5±0.3μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('period', 'unique_monotonic_inc')
+      39.1±0.3μs       45.2±0.6μs     1.16  indexing.NonNumericSeriesIndexing.time_getitem_pos_slice('datetime', 'nonunique_monotonic_inc')
+         459±2μs          531±2μs     1.16  groupby.GroupManyLabels.time_sum(1)
+      43.3±0.2μs      50.0±0.08μs     1.15  indexing.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 'unique_monotonic_inc')
+      53.5±0.2μs       61.8±0.2μs     1.15  dtypes.SelectDtypes.time_select_dtype_bool_exclude(<class 'complex'>)
+      57.6±0.4μs       66.4±0.6μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int8')
+      37.2±0.4μs       42.9±0.6μs     1.15  timeseries.SortIndex.time_get_slice(False)
+      60.6±0.2μs       69.8±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt16')
+      27.8±0.1ms       32.0±0.2ms     1.15  io.hdf.HDF.time_write_hdf('fixed')
+     1.83±0.01ms      2.11±0.02ms     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'transformation', 5)
+     1.94±0.02ms      2.23±0.02ms     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'transformation', 5)
+     1.99±0.01ms      2.29±0.03ms     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'transformation', 5)
+        1.75±0ms      2.01±0.01ms     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'rank', 'direct', 5)
+     4.80±0.02μs      5.50±0.08μs     1.15  frame_methods.ToDict.time_to_dict_ints('series')
+      1.72±0.1μs       1.97±0.3μs     1.15  index_cached_properties.IndexCache.time_values('PeriodIndex')
+      60.5±0.2μs       69.4±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt16')
+        61.5±1μs       70.5±0.4μs     1.15  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt32')
+     36.6±0.08ms       42.0±0.6ms     1.15  io.style.Render.time_tooltips_render(12, 120)
+     1.67±0.01ms      1.91±0.01ms     1.15  groupby.GroupByMethods.time_dtype_as_group('uint', 'quantile', 'direct', 5)
+      60.1±0.3μs       68.9±0.2μs     1.15  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt8')
+      53.7±0.3μs       61.5±0.3μs     1.15  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'complex'>)
+     11.6±0.08ms       13.3±0.2ms     1.14  groupby.Apply.time_scalar_function_multi_col(5)
+     13.2±0.04ms       15.2±0.2ms     1.14  stat_ops.Rank.time_rank('DataFrame', True)
+      57.0±0.3μs       65.2±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int8')
+     1.74±0.01ms         1.99±0ms     1.14  groupby.GroupByMethods.time_dtype_as_group('datetime', 'rank', 'direct', 5)
+      57.8±0.1μs       66.1±0.1μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int16')
+     1.78±0.01ms      2.04±0.01ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'rank', 'direct', 5)
+      53.6±0.3μs       61.3±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'bool'>)
+      53.7±0.6μs       61.5±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude(<class 'bool'>)
+      59.6±0.3μs       68.1±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int64')
+     15.6±0.05ms       17.8±0.2ms     1.14  io.csv.ReadCSVThousands.time_thousands(',', None, 'c')
+      58.5±0.5μs       66.9±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int32')
+      61.4±0.2μs       70.2±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt32')
+      58.1±0.2μs       66.4±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int16')
+      60.1±0.7μs       68.6±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt8')
+     1.83±0.01ms      2.09±0.02ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'mean', 'transformation', 5)
+      61.4±0.4μs       70.1±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt32')
+      53.9±0.8μs       61.5±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude(<class 'bool'>)
+      60.2±0.4μs       68.7±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt8')
+      60.2±0.2μs       68.6±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt8')
+        1.79±0ms      2.04±0.01ms     1.14  groupby.GroupByMethods.time_dtype_as_group('int', 'rank', 'direct', 5)
+      57.3±0.3μs       65.2±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int8')
+      61.6±0.2μs       70.2±0.5μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt32')
+      61.0±0.2μs       69.4±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt16')
+      59.7±0.2μs       67.9±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int64')
+      58.0±0.1μs       66.1±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int16')
+      58.6±0.2μs       66.7±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('Int32')
+      53.8±0.2μs       61.2±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude(<class 'complex'>)
+      57.4±0.5μs       65.3±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_string_exclude('Int8')
+     1.70±0.01ms      1.93±0.04ms     1.14  frame_methods.Interpolate.time_interpolate_some_good(None)
+     15.8±0.01ms      18.0±0.06ms     1.14  stat_ops.Correlation.time_corr_wide_nans('pearson')
+     2.07±0.01ms      2.35±0.03ms     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'transformation', 5)
+        1.69±0ms         1.92±0ms     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'quantile', 'direct', 5)
+     30.4±0.02ms       34.5±0.3ms     1.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function floordiv>)
+      62.1±0.2μs       70.6±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('UInt64')
+      62.3±0.3μs       70.8±0.2μs     1.14  dtypes.SelectDtypes.time_select_dtype_int_exclude('UInt64')
+      30.3±0.1ms       34.5±0.3ms     1.14  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function floordiv>)
+     59.8±0.09μs       67.9±0.4μs     1.14  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int64')
+     25.5±0.09ms       28.9±0.1ms     1.14  rolling.Apply.time_rolling('Series', 3, 'float', <built-in function sum>, False)
+     15.5±0.02ms       17.6±0.1ms     1.14  io.csv.ReadCSVThousands.time_thousands('|', None, 'c')
+      85.4±0.3ms         96.9±2ms     1.14  io.json.ToJSON.time_to_json('split', 'df')
+      62.1±0.5μs       70.5±0.3μs     1.14  dtypes.SelectDtypes.time_select_dtype_float_exclude('UInt64')
+     4.82±0.02μs      5.47±0.03μs     1.14  frame_methods.ToDict.time_to_dict_datetimelike('series')
+     2.05±0.02ms         2.32±0ms     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'min', 'transformation', 5)
+      44.0±0.5μs       49.9±0.2μs     1.13  dtypes.SelectDtypes.time_select_dtype_int_include(<class 'int'>)
+     25.5±0.09ms       29.0±0.2ms     1.13  rolling.Apply.time_rolling('Series', 3, 'int', <built-in function sum>, False)
+      62.0±0.4μs       70.3±0.3μs     1.13  dtypes.SelectDtypes.time_select_dtype_string_exclude('UInt64')
+     3.91±0.04ms      4.44±0.05ms     1.13  frame_methods.Rank.time_rank('uint')
+     33.2±0.03ms       37.7±0.2ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function floordiv>)
+     13.1±0.05ms       14.8±0.2ms     1.13  stat_ops.Rank.time_rank('DataFrame', False)
+     33.1±0.06ms       37.4±0.3ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function mod>)
+      25.7±0.3ms       29.0±0.2ms     1.13  rolling.Apply.time_rolling('DataFrame', 3, 'int', <built-in function sum>, False)
+     1.94±0.01ms      2.19±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'var', 'transformation', 5)
+     13.3±0.03ms       15.1±0.2ms     1.13  stat_ops.Rank.time_average_old('DataFrame', False)
+      25.6±0.2ms       28.9±0.4ms     1.13  rolling.Apply.time_rolling('DataFrame', 3, 'float', <built-in function sum>, False)
+      28.2±0.5ms       31.9±0.2ms     1.13  groupby.Nth.time_groupby_nth_all('datetime')
+     33.3±0.05ms       37.6±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 4, <built-in function floordiv>)
+     2.03±0.01ms      2.30±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'transformation', 5)
+     1.96±0.01ms      2.22±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'transformation', 5)
+      44.5±0.2μs       50.2±0.1μs     1.13  dtypes.SelectDtypes.time_select_dtype_float_include(<class 'float'>)
+      89.3±0.6μs        101±0.9μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'direct', 1)
+      78.4±0.3ms         88.4±2ms     1.13  io.json.ToJSONWide.time_to_json('values', 'df')
+       100±0.7μs        113±0.7μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'direct', 5)
+      70.8±0.1μs       79.8±0.4μs     1.13  dtypes.SelectDtypes.time_select_dtype_int_exclude('m8[ns]')
+      71.2±0.3μs         80.2±1μs     1.13  dtypes.SelectDtypes.time_select_dtype_float_exclude('int16')
+     3.93±0.03ms      4.43±0.03ms     1.13  frame_methods.Rank.time_rank('int')
+     2.07±0.02ms      2.33±0.01ms     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'transformation', 5)
+      33.3±0.1ms       37.5±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function floordiv>)
+        88.9±2ms        100±0.9ms     1.13  io.json.ToJSON.time_to_json('split', 'df_date_idx')
+      17.7±0.3ms       19.9±0.5ms     1.13  groupby.Cumulative.time_frame_transform_many_nulls('Int64', 'cummax')
+         1.07±0s       1.21±0.02s     1.13  groupby.String.time_str_func('str', 'first')
+     32.2±0.05ms       36.3±0.1ms     1.13  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function mod>)
+     13.5±0.03ms       15.2±0.2ms     1.12  stat_ops.Rank.time_average_old('DataFrame', True)
+     2.06±0.03ms      2.32±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'max', 'transformation', 5)
+     2.15±0.01ms      2.42±0.02ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'transformation', 5)
+         1.09±0s       1.23±0.02s     1.12  groupby.String.time_str_func('str', 'last')
+      33.4±0.1ms       37.5±0.3ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function floordiv>)
+      59.3±0.9μs       66.6±0.2μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('Int32')
+     17.6±0.02ms       19.8±0.1ms     1.12  groupby.Cumulative.time_frame_transform_many_nulls('Int64', 'cummin')
+      77.3±0.5ms         86.7±1ms     1.12  io.json.ToJSON.time_to_json('values', 'df_date_idx')
+      59.5±0.4μs       66.8±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('Int32')
+      52.6±0.2μs       59.0±0.6μs     1.12  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 10000)
+      29.1±0.2ms       32.6±0.2ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 5.0, <built-in function mod>)
+         496±9ns          557±8ns     1.12  index_object.IntervalIndexMethod.time_is_unique(100000)
+      20.9±0.4ms       23.4±0.7ms     1.12  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummin')
+     3.41±0.02ms      3.82±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'transformation', 5)
+      70.9±0.1μs       79.5±0.9μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int64')
+     2.15±0.01ms      2.41±0.04ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'transformation', 5)
+     1.46±0.01ms         1.64±0ms     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumsum', 'transformation', 5)
+     2.16±0.01ms      2.42±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'transformation', 5)
+      71.0±0.3μs       79.5±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('float32')
+     1.33±0.02ms      1.49±0.03ms     1.12  groupby.Datelike.time_sum('period_range')
+      70.9±0.3μs       79.3±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('m8[ns]')
+     2.18±0.02ms      2.43±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'transformation', 5)
+      23.7±0.3ms       26.5±0.1ms     1.12  io.style.Render.time_tooltips_render(36, 12)
+      70.9±0.4μs       79.3±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('m8[ns]')
+     4.27±0.02ms      4.78±0.04ms     1.12  frame_methods.Lookup.time_frame_fancy_lookup
+      70.9±0.3μs       79.3±0.8μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint64')
+      76.9±0.7ms       86.0±0.5ms     1.12  io.json.ToJSON.time_to_json('values', 'df')
+     2.04±0.02ms      2.28±0.03ms     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'last', 'transformation', 5)
+       102±0.3μs          114±1μs     1.12  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 1)
+      70.8±0.3μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('M8[ns]')
+        3.07±0ms       3.43±0.1ms     1.12  indexing.InsertColumns.time_assign_list_of_columns_concat
+     1.89±0.01ms      2.12±0.01ms     1.12  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'transformation', 5)
+        753±10μs         841±10μs     1.12  stat_ops.FrameOps.time_op('sum', 'int', 0)
+      70.8±0.3μs       79.1±0.7μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint16')
+      70.9±0.3μs       79.3±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('m8[ns]')
+      71.3±0.3μs       79.6±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('M8[ns]')
+      70.9±0.2μs       79.3±0.8μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int8')
+      71.1±0.3μs       79.5±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('int64')
+      55.2±0.2μs       61.6±0.3μs     1.12  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'nonunique_monotonic_inc')
+      70.8±0.2μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_int_exclude('bool')
+     32.4±0.07ms       36.1±0.3ms     1.12  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 2, <built-in function floordiv>)
+        80.1±2ms         89.5±2ms     1.12  io.json.ToJSONWide.time_to_json('values', 'df_date_idx')
+      70.8±0.2μs       79.0±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('int8')
+     11.4±0.03ms       12.7±0.2ms     1.12  groupby.Float32.time_sum
+        157±20ms          176±7ms     1.12  gil.ParallelGroupbyMethods.time_loop(8, 'count')
+      70.9±0.3μs       79.1±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int32')
+      70.7±0.3μs       78.9±0.3μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('int8')
+      71.2±0.3μs       79.4±0.9μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('float32')
+      70.9±0.4μs       79.1±0.5μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('bool')
+      71.1±0.4μs       79.3±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_float_exclude('int64')
+      70.7±0.3μs       78.8±0.4μs     1.12  dtypes.SelectDtypes.time_select_dtype_string_exclude('bool')
+     29.1±0.05ms       32.4±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.int64'>, 3.0, <built-in function mod>)
+      70.9±0.2μs       79.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint8')
+      71.4±0.5μs       79.6±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('M8[ns]')
+      71.2±0.3μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('float32')
+      70.9±0.4μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint16')
+     3.42±0.06ms      3.81±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('uint', 'sem', 'transformation', 5)
+      70.9±0.2μs       79.0±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint64')
+      56.5±0.8μs       62.9±0.2μs     1.11  indexing.DataFrameNumericIndexing.time_loc
+      70.9±0.4μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint8')
+      70.9±0.3μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('complex128')
+      71.2±0.4μs       79.2±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint16')
+      71.1±0.5μs       79.1±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint32')
+      72.7±0.7μs       81.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('datetime64[ns]')
+      71.2±0.4μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('complex128')
+     30.3±0.04ms       33.7±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function mod>)
+      71.0±0.2μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint8')
+      51.7±0.6μs       57.5±0.2μs     1.11  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 10000)
+        46.8±3ms       52.0±0.1ms     1.11  io.hdf.HDFStoreDataFrame.time_write_store_table_wide
+      71.4±0.3μs       79.4±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('float32')
+     1.88±0.02ms      2.09±0.02ms     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'mean', 'transformation', 5)
+      71.1±0.3μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int8')
+      17.1±0.2ms      19.0±0.09ms     1.11  frame_methods.ToDict.time_to_dict_ints('index')
+      28.9±0.6ms       32.1±0.2ms     1.11  arithmetic.Ops2.time_frame_int_mod
+      71.1±0.5μs       79.0±0.2μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint32')
+      72.6±0.5μs       80.6±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('datetime64[ns]')
+      71.4±0.3μs       79.3±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('int16')
+      71.3±0.5μs       79.2±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int32')
+      71.3±0.4μs       79.2±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('M8[ns]')
+      71.2±0.3μs       79.1±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('int32')
+       112±0.4μs        124±0.7μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct', 5)
+      71.0±0.5μs       78.8±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint8')
+      71.2±0.2μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('uint64')
+     1.57±0.01ms      1.74±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'transformation', 5)
+      71.0±0.2μs       78.8±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('int16')
+     21.8±0.04ms       24.2±0.1ms     1.11  groupby.Cumulative.time_frame_transform('Float64', 'cummax')
+      71.3±0.5μs       79.1±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('uint32')
+      71.2±0.3μs       78.9±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_int_exclude('int16')
+      71.2±0.4μs       79.0±0.4μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('complex128')
+      71.5±0.3μs       79.3±0.7μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('complex64')
+     1.48±0.02ms      1.64±0.01ms     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'transformation', 5)
+     28.2±0.07ms       31.2±0.1ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 4, <built-in function mod>)
+        87.4±3ms         97.0±2ms     1.11  io.json.ToJSONWide.time_to_json('records', 'df')
+      71.4±0.3μs       79.2±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('uint32')
+     28.1±0.02ms       31.1±0.2ms     1.11  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 5.0, <built-in function mod>)
+      20.7±0.3ms      22.9±0.08ms     1.11  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummax')
+      71.5±0.6μs       79.2±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('float64')
+        78.2±8ms         86.6±3ms     1.11  gil.ParallelGroupbyMethods.time_loop(4, 'count')
+      71.1±0.2μs       78.8±0.5μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('int32')
+      71.5±0.3μs       79.2±0.6μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint64')
+      72.7±0.6μs       80.5±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_bool_exclude('datetime64[ns]')
+      71.3±0.5μs       78.9±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_exclude('complex128')
+         973±6μs         1.08±0ms     1.11  stat_ops.FrameOps.time_op('mean', 'int', 0)
+      72.3±0.3μs       80.0±0.3μs     1.11  dtypes.SelectDtypes.time_select_dtype_float_exclude('timedelta64[ns]')
+      51.5±0.3μs       56.9±0.4μs     1.11  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 10000)
+      71.3±0.5μs       78.7±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('float64')
+      57.2±0.1μs       63.2±0.7μs     1.10  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 10000)
+      71.2±0.3μs       78.6±0.2μs     1.10  dtypes.SelectDtypes.time_select_dtype_int_exclude('complex64')
+     28.3±0.07ms       31.2±0.3ms     1.10  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 3.0, <built-in function mod>)
+      71.4±0.5μs       78.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('complex64')
+     1.91±0.01ms      2.11±0.02ms     1.10  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'transformation', 5)
+      49.2±0.7μs       54.3±0.3μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'non_monotonic')
+         115±1μs        127±0.6μs     1.10  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 5)
+      71.5±0.6μs       78.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_string_exclude('complex64')
+         983±4μs         1.08±0ms     1.10  stat_ops.FrameOps.time_op('mean', 'float', 0)
+     1.47±0.01ms      1.62±0.01ms     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummax', 'transformation', 5)
+      80.5±0.8ms       88.7±0.7ms     1.10  reshape.PivotTable.time_pivot_table_margins
+      71.4±0.5μs       78.6±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_bool_exclude('uint16')
+     2.05±0.02ms      2.26±0.02ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'transformation', 5)
+       136±0.5ms          150±1ms     1.10  io.stata.StataMissing.time_read_stata('tc')
+      73.0±0.5μs       80.4±0.3μs     1.10  dtypes.SelectDtypes.time_select_dtype_float_exclude('datetime64[ns]')
+      72.6±0.7μs       79.9±0.4μs     1.10  dtypes.SelectDtypes.time_select_dtype_string_exclude('timedelta64[ns]')
+        1.15±0ms      1.27±0.01ms     1.10  stat_ops.Correlation.time_corr('spearman')
+      77.8±0.3μs       85.5±0.2μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'non_monotonic')
+      87.2±0.4ms       95.8±0.8ms     1.10  io.json.ToJSON.time_to_json('records', 'df')
+      71.8±0.8μs       78.9±0.5μs     1.10  dtypes.SelectDtypes.time_select_dtype_int_exclude('float64')
+     1.47±0.01ms      1.61±0.01ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'transformation', 5)
+      55.1±0.5μs       60.5±0.8μs     1.10  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('period', 'unique_monotonic_inc')
+       136±0.6ms          149±1ms     1.10  io.stata.StataMissing.time_read_stata('tw')
+      22.4±0.1ms      24.6±0.06ms     1.10  groupby.Cumulative.time_frame_transform('Float64', 'cummin')
+      92.0±0.6ms        101±0.6ms     1.10  io.json.ToJSONWide.time_to_json('split', 'df_date_idx')
+      32.7±0.2ms      35.8±0.03ms     1.10  rolling.Apply.time_rolling('Series', 300, 'float', <built-in function sum>, False)
+       110±0.5ms          121±3ms     1.09  io.json.ToJSONWide.time_to_json('index', 'df_date_idx')
+      36.5±0.6ms       40.0±0.5ms     1.09  join_merge.Merge.time_merge_2intkey(True)
+      91.6±0.9μs          100±1μs     1.09  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 5)
+      65.3±0.5μs       71.3±0.5μs     1.09  indexing.DataFrameNumericIndexing.time_iloc
+         891±4μs          972±6μs     1.09  groupby.SumMultiLevel.time_groupby_sum_multiindex
+         157±2ms          172±6ms     1.09  frame_methods.ToDict.time_to_dict_datetimelike('list')
+         131±1ms          142±2ms     1.09  io.stata.StataMissing.time_read_stata('td')
+         167±2ms          181±7ms     1.09  frame_methods.ToDict.time_to_dict_datetimelike('index')
+         133±1ms        144±0.9ms     1.09  io.stata.StataMissing.time_read_stata('tm')
+      85.4±0.6μs       92.7±0.2μs     1.09  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'nonunique_monotonic_inc')
+     32.8±0.08ms       35.6±0.1ms     1.09  rolling.Apply.time_rolling('Series', 300, 'int', <built-in function sum>, False)
+     1.56±0.01ms         1.69±0ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'cummin', 'transformation', 5)
+      88.1±0.8ms         95.5±1ms     1.08  io.json.ToJSONWide.time_to_json('split', 'df')
+     5.09±0.04μs       5.52±0.1μs     1.08  indexing.NonNumericSeriesIndexing.time_getitem_scalar('period', 'non_monotonic')
+         173±1ms          188±7ms     1.08  frame_methods.ToDict.time_to_dict_datetimelike('split')
+     1.76±0.01ms      1.90±0.01ms     1.08  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'transformation', 5)
+       104±0.5ms        113±0.6ms     1.08  io.json.ToJSON.time_to_json('index', 'df')
+      74.9±0.6μs       81.1±0.1μs     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'head', 'direct', 1)
+      74.0±0.4μs       80.1±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('datetime', 'head', 'direct', 1)
+         103±2ms          112±1ms     1.08  io.json.ToJSONWide.time_to_json('index', 'df')
+      82.4±0.7μs       89.1±0.6μs     1.08  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 1)
+     1.46±0.01ms      1.58±0.01ms     1.08  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'transformation', 5)
+      83.7±0.4μs       90.5±0.8μs     1.08  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct', 5)
+     13.5±0.05ms      14.6±0.03ms     1.08  io.csv.ReadCSVSkipRows.time_skipprows(10000, 'c')
+     14.5±0.04ms      15.6±0.07ms     1.08  io.style.Render.time_tooltips_render(12, 12)
+       109±0.3μs        118±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'direct', 5)
+         1.12±0s       1.21±0.02s     1.08  strings.Dummies.time_get_dummies('string[pyarrow]')
+       134±0.6ms          145±1ms     1.08  io.stata.StataMissing.time_read_stata('tq')
+     3.20±0.01ms      3.45±0.02ms     1.08  series_methods.NanOps.time_func('std', 1000000, 'int8')
+      6.23±0.1ms      6.73±0.03ms     1.08  groupby.Apply.time_scalar_function_single_col(5)
+      74.6±0.8μs       80.6±0.3μs     1.08  groupby.GroupByMethods.time_dtype_as_group('uint', 'head', 'direct', 1)
+     3.68±0.02ms      3.98±0.03ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'transformation', 5)
+      67.7±0.7μs       73.1±0.6μs     1.08  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 1)
+      84.0±0.7μs       90.7±0.4μs     1.08  indexing.NonNumericSeriesIndexing.time_getitem_label_slice('datetime', 'unique_monotonic_inc')
+     12.7±0.05ms      13.7±0.09ms     1.08  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function floordiv>, (100000, 100))
+     1.58±0.02ms      1.70±0.02ms     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'transformation', 5)
+      14.0±0.2ms      15.1±0.04ms     1.08  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'sem')
+      53.1±0.3μs       57.3±0.1μs     1.08  dtypes.SelectDtypes.time_select_dtype_bool_include(<class 'bool'>)
+       109±0.8μs        118±0.5μs     1.08  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'direct', 5)
+       256±0.9ns          276±6ns     1.08  timeseries.DatetimeIndex.time_is_dates_only('dst')
+         128±2μs          137±3μs     1.08  indexing.IntervalIndexing.time_getitem_list
+      33.1±0.3ms       35.6±0.1ms     1.08  rolling.Apply.time_rolling('DataFrame', 300, 'float', <built-in function sum>, False)
+      74.3±0.7μs       79.9±0.2μs     1.08  groupby.GroupByMethods.time_dtype_as_field('float', 'head', 'direct', 1)
+         146±2μs        157±0.8μs     1.08  groupby.GroupByMethods.time_dtype_as_field('int', 'tail', 'direct', 1)
+      1.10±0.01s          1.18±0s     1.08  strings.Dummies.time_get_dummies('str')
+       137±0.9ms          147±2ms     1.07  io.json.ToJSONLines.time_floats_with_int_idex_lines
+     2.91±0.01ms      3.13±0.01ms     1.07  stat_ops.FrameOps.time_op('skew', 'int', 0)
+     4.43±0.05μs      4.75±0.05μs     1.07  indexing.NonNumericSeriesIndexing.time_getitem_scalar('string', 'non_monotonic')
+      83.6±0.3μs       89.7±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_field('float', 'head', 'direct', 5)
+      89.5±0.6ms       96.0±0.9ms     1.07  io.json.ToJSON.time_to_json('records', 'df_date_idx')
+        177±20ms          190±5ms     1.07  gil.ParallelGroupbyMethods.time_loop(8, 'mean')
+      74.9±0.1μs       80.4±0.4μs     1.07  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct', 1)
+     35.6±0.03ms      38.2±0.07ms     1.07  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (100000, 100))
+      33.0±0.2ms      35.4±0.07ms     1.07  rolling.Apply.time_rolling('DataFrame', 300, 'int', <built-in function sum>, False)
+     4.01±0.01ms      4.30±0.01ms     1.07  stat_ops.FrameOps.time_op('kurt', 'float', 0)
+       145±0.6μs          155±2μs     1.07  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Float64Index'>, 100000)
+        80.9±8ms         86.7±1ms     1.07  gil.ParallelGroupbyMethods.time_loop(4, 'last')
+       107±0.8μs        115±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'direct', 5)
+         134±1ms          144±2ms     1.07  io.stata.StataMissing.time_read_stata('th')
+     22.0±0.09ms       23.6±0.3ms     1.07  stat_ops.FrameMultiIndexOps.time_op(0, 'mad')
+     2.53±0.07μs      2.71±0.05μs     1.07  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(0, 'end', 'year', 'QS', 12)
+      59.1±0.2μs       63.2±0.2μs     1.07  dtypes.SelectDtypes.time_select_dtype_int_include('Int64')
+     2.35±0.01ms      2.51±0.01ms     1.07  groupby.GroupByMethods.time_dtype_as_group('object', 'rank', 'transformation', 5)
+         148±2μs        158±0.7μs     1.07  groupby.GroupByMethods.time_dtype_as_field('uint', 'tail', 'direct', 1)
+         144±2μs        154±0.8μs     1.07  groupby.GroupByMethods.time_dtype_as_group('uint', 'tail', 'direct', 1)
+      1.11±0.01s          1.19±0s     1.07  strings.Dummies.time_get_dummies('string[python]')
+      74.9±0.4μs       80.0±0.3μs     1.07  groupby.GroupByMethods.time_dtype_as_field('uint', 'head', 'direct', 1)
+     4.17±0.01ms      4.45±0.01ms     1.07  stat_ops.FrameOps.time_op('skew', 'float', 0)
+     2.53±0.03μs      2.70±0.05μs     1.07  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'quarter', None, 5)
+     1.78±0.01ms      1.90±0.01ms     1.07  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'transformation', 5)
+     3.69±0.02ms      3.93±0.04ms     1.07  frame_methods.Interpolate.time_interpolate_some_good('infer')
+      6.91±0.2μs      7.36±0.07μs     1.07  tslibs.timestamp.TimestampProperties.time_is_quarter_start(None, 'B')
+      70.6±0.3μs       75.2±0.7μs     1.07  dtypes.SelectDtypes.time_select_dtype_float_include('float64')
+        88.2±9ms         93.9±1ms     1.06  gil.ParallelGroupbyMethods.time_loop(4, 'sum')
+      35.9±0.2ms       38.2±0.5ms     1.06  groupby.Nth.time_groupby_nth_all('object')
+      26.1±0.1ms      27.8±0.05ms     1.06  io.hdf.HDF.time_read_hdf('fixed')
+     3.21±0.01ms      3.41±0.03ms     1.06  series_methods.NanOps.time_func('var', 1000000, 'int8')
+     28.5±0.08ms      30.3±0.07ms     1.06  rolling.Pairwise.time_groupby(({}, 'expanding'), 'cov', False)
+     2.78±0.02ms      2.96±0.01ms     1.06  stat_ops.FrameOps.time_op('kurt', 'int', 0)
+     6.11±0.02μs      6.49±0.05μs     1.06  indexing.NonNumericSeriesIndexing.time_getitem_scalar('string', 'unique_monotonic_inc')
+      89.6±0.8ms       95.1±0.2ms     1.06  frame_methods.Interpolate.time_interpolate(None)
+      11.2±0.1ms      11.9±0.09ms     1.06  io.style.Render.time_apply_render(36, 12)
+      16.0±0.2μs       16.9±0.2μs     1.06  indexing.NonNumericSeriesIndexing.time_getitem_scalar('datetime', 'nonunique_monotonic_inc')
+         134±1μs          142±1μs     1.06  groupby.GroupByMethods.time_dtype_as_group('datetime', 'tail', 'direct', 1)
+     2.51±0.02μs      2.66±0.01μs     1.06  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 12)
+      76.1±0.8μs       80.8±0.2μs     1.06  groupby.GroupByMethods.time_dtype_as_group('int', 'head', 'direct', 1)
+         137±2ms        145±0.5ms     1.06  io.json.ToJSONLines.time_floats_with_dt_index_lines
+     7.18±0.01ms       7.61±0.1ms     1.06  series_methods.NanOps.time_func('sem', 1000000, 'int8')
+        170±20ms          180±5ms     1.06  gil.ParallelGroupbyMethods.time_loop(8, 'min')
+     30.1±0.06ms       31.9±0.2ms     1.06  rolling.Pairwise.time_groupby(({'window': 1000}, 'rolling'), 'cov', False)
+      41.3±0.3ms       43.8±0.4ms     1.06  groupby.Nth.time_frame_nth_any('object')
+        81.8±9ms       86.6±0.7ms     1.06  gil.ParallelGroupbyMethods.time_loop(4, 'prod')
+         147±1μs          156±3μs     1.06  hash_functions.NumericSeriesIndexingShuffled.time_loc_slice(<class 'pandas.core.indexes.numeric.Int64Index'>, 100000)
+      70.3±0.2μs       74.4±0.5μs     1.06  dtypes.SelectDtypes.time_select_dtype_bool_include('bool')
+        1.64±0ms      1.73±0.01ms     1.06  stat_ops.FrameOps.time_op('var', 'int', 0)
+     30.0±0.05ms      31.7±0.05ms     1.06  rolling.Pairwise.time_groupby(({'window': 10}, 'rolling'), 'cov', False)
+      70.3±0.2μs       74.3±0.3μs     1.06  dtypes.SelectDtypes.time_select_dtype_int_include('int64')
+     2.51±0.02μs      2.65±0.02μs     1.06  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 3)
+     3.11±0.01ms      3.29±0.02ms     1.06  groupby.GroupByMethods.time_dtype_as_group('uint', 'quantile', 'transformation', 5)
+     2.91±0.04μs      3.07±0.02μs     1.05  series_methods.SeriesGetattr.time_series_datetimeindex_repr
+         135±1μs          142±2μs     1.05  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct', 1)
+         260±1μs          273±2μs     1.05  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct', 5)
+      30.6±0.1ms       32.2±0.1ms     1.05  rolling.Pairwise.time_groupby(({'window': 10}, 'rolling'), 'corr', False)
+     1.89±0.01ms      1.99±0.01ms     1.05  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'transformation', 5)
+     2.55±0.02μs      2.69±0.07μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(0, 'end', 'quarter', 'QS', 5)
+         157±1μs        165±0.6μs     1.05  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 1)
+     5.20±0.09μs      5.47±0.02μs     1.05  indexing.NumericSeriesIndexing.time_getitem_scalar(<class 'pandas.core.indexes.numeric.Float64Index'>, 'unique_monotonic_inc')
+         254±2ns          268±1ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_local')
+     8.62±0.05ms       9.07±0.1ms     1.05  io.style.Render.time_format_render(36, 12)
+     1.65±0.01ms      1.73±0.01ms     1.05  stat_ops.FrameOps.time_op('var', 'float', 0)
+     2.56±0.03μs      2.69±0.01μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'start', 'month', 'QS', 5)
+         262±1μs          275±3μs     1.05  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'direct', 5)
+         288±3ns          303±1ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_naive')
+         167±1μs          175±2μs     1.05  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'direct', 5)
+      28.8±0.1ms       30.2±0.2ms     1.05  io.style.Render.time_apply_render(12, 120)
+       166±0.8μs          174±1μs     1.05  groupby.GroupByMethods.time_dtype_as_field('float', 'tail', 'direct', 5)
+        1.36±0μs      1.43±0.02μs     1.05  attrs_caching.SeriesArrayAttribute.time_extract_array_numpy('object')
+         176±2μs        185±0.7μs     1.05  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 5)
+     2.64±0.03μs      2.77±0.04μs     1.05  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'quarter', 'QS', 5)
+       116±0.7μs        121±0.3μs     1.05  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct', 5)
+     20.3±0.07ms      21.3±0.05ms     1.05  groupby.AggFunctions.time_different_python_functions_multicol
+       254±0.7ns          265±2ns     1.05  timeseries.DatetimeIndex.time_is_dates_only('tz_aware')
+     1.34±0.01μs      1.41±0.02μs     1.05  attrs_caching.SeriesArrayAttribute.time_extract_array('datetime64')
+     5.35±0.03μs      5.59±0.01μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply(<Day>)
+     3.04±0.01ms         3.18±0ms     1.04  groupby.GroupByMethods.time_dtype_as_group('int', 'rank', 'transformation', 5)
+     3.23±0.02ms      3.37±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('float', 'quantile', 'transformation', 5)
+     2.55±0.02μs      2.65±0.04μs     1.04  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', None, 5)
+       120±0.9μs        125±0.6μs     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'shift', 'direct', 5)
+      33.6±0.2ms       35.0±0.8ms     1.04  groupby.Nth.time_series_nth_all('float32')
+     3.05±0.02ms      3.18±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'rank', 'transformation', 5)
+     10.5±0.05ms      10.9±0.02ms     1.04  frame_methods.Rank.time_rank('float')
+     1.56±0.01ms      1.63±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('uint', 'pct_change', 'direct', 5)
+     4.50±0.03ms      4.68±0.03ms     1.04  io.csv.ReadCSVParseSpecialDate.time_read_special_date('mdY', 'c')
+      45.0±0.2μs       46.8±0.2μs     1.04  indexing.NumericSeriesIndexing.time_iloc_list_like(<class 'pandas.core.indexes.numeric.Float64Index'>, 'nonunique_monotonic_inc')
+     9.10±0.06ms      9.46±0.05ms     1.04  inference.ToDatetimeISO8601.time_iso8601_infer_zero_tz_fromat
+     5.57±0.02μs      5.79±0.07μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply_np_dt64(<Day>)
+       261±0.9μs          272±3μs     1.04  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'direct', 5)
+      13.2±0.3μs      13.7±0.06μs     1.04  tslibs.offsets.OffestDatetimeArithmetic.time_apply_np_dt64(<BusinessMonthBegin>)
+     2.63±0.04μs      2.73±0.02μs     1.04  tslibs.fields.TimeGetStartEndField.time_get_start_end_field(1, 'end', 'month', 'QS', 12)
+     1.57±0.01ms      1.63±0.01ms     1.04  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'transformation', 5)
+     38.8±0.06ms       40.2±0.1ms     1.04  groupby.Nth.time_series_nth_any('object')
+     1.36±0.01μs      1.41±0.01μs     1.04  attrs_caching.SeriesArrayAttribute.time_extract_array('category')
+        1.68±0ms      1.74±0.01ms     1.04  stat_ops.FrameOps.time_op('prod', 'float', 0)
+      6.02±0.2μs       6.24±0.1μs     1.04  index_cached_properties.IndexCache.time_engine('DatetimeIndex')
+      24.8±0.1ms      25.7±0.07ms     1.04  gil.ParallelGroupbyMethods.time_parallel(2, 'last')
+     11.2±0.08ms      11.6±0.05ms     1.04  algorithms.Hashing.time_series_string
+       315±0.5ms          326±5ms     1.03  io.json.ReadJSONLines.time_read_json_lines('datetime')
+      83.0±0.2ms       85.9±0.6ms     1.03  io.hdf.HDF.time_write_hdf('table')
+     6.49±0.03ms       6.72±0.1ms     1.03  frame_methods.Repr.time_html_repr_trunc_mi
+       259±0.2ms          268±6ms     1.03  io.json.ReadJSON.time_read_json('records', 'int')
+         270±2μs          280±1μs     1.03  hash_functions.NumericSeriesIndexing.time_loc_slice(<class 'pandas.core.indexes.numeric.UInt64Index'>, 100000)
+     1.36±0.01μs      1.41±0.01μs     1.03  attrs_caching.SeriesArrayAttribute.time_extract_array_numpy('datetime64tz')
+       188±0.7μs          194±3μs     1.03  groupby.GroupByMethods.time_dtype_as_field('uint', 'first', 'direct', 5)
+         540±3μs        558±0.8μs     1.03  groupby.GroupByMethods.time_dtype_as_field('float', 'shift', 'transformation', 1)
+      23.3±0.1μs       24.1±0.1μs     1.03  tslibs.offsets.OffestDatetimeArithmetic.time_apply(<CustomBusinessDay>)
+     1.30±0.01μs         1.34±0μs     1.03  tslibs.offsets.OnOffset.time_on_offset(<DateOffset: days=2, months=2>)
+     1.05±0.03μs      1.09±0.04μs     1.03  index_cached_properties.IndexCache.time_is_monotonic_decreasing('Int64Index')
+       227±0.7ms        234±0.5ms     1.03  groupby.AggFunctions.time_different_python_functions_singlecol
+      26.7±0.2ms      27.5±0.07ms     1.03  gil.ParallelGroupbyMethods.time_parallel(2, 'sum')
+     1.68±0.01ms      1.72±0.02ms     1.03  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'transformation', 5)
+        1.63±0ms      1.67±0.02ms     1.03  groupby.GroupByMethods.time_dtype_as_group('float', 'pct_change', 'direct', 5)
+       189±0.5μs        195±0.6μs     1.03  groupby.GroupByMethods.time_dtype_as_field('uint', 'max', 'direct', 5)
+     5.43±0.04μs      5.58±0.03μs     1.03  tslibs.offsets.OffestDatetimeArithmetic.time_add_10(<Day>)
+     3.50±0.02ms      3.60±0.02ms     1.03  stat_ops.FrameOps.time_op('sem', 'int', 0)
+     1.46±0.01μs      1.50±0.01μs     1.03  tslibs.timestamp.TimestampConstruction.time_from_datetime_aware
+         153±1μs        157±0.7μs     1.03  period.Algorithms.time_drop_duplicates('series')
+     1.19±0.02ms      1.22±0.02ms     1.03  index_cached_properties.IndexCache.time_engine('MultiIndex')
+         431±1ns          442±2ns     1.03  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'non_monotonic', True, 2000000)
+     5.23±0.02ms      5.36±0.01ms     1.02  indexing.DataFrameNumericIndexing.time_bool_indexer
+       389±0.9μs          398±2μs     1.02  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct', 5)
+       146±0.5μs        149±0.6μs     1.02  tslibs.period.PeriodProperties.time_property('M', 'end_time')
+        2.01±0ms      2.06±0.01ms     1.02  groupby.GroupByMethods.time_dtype_as_field('object', 'rank', 'transformation', 1)
+       192±0.3μs        197±0.5μs     1.02  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct', 5)
+     3.84±0.02ms      3.93±0.02ms     1.02  stat_ops.FrameOps.time_op('sem', 'float', 0)
+       402±0.6ns          411±1ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'monotonic_decr', True, 100000)
+      7.01±0.1ms       7.15±0.1ms     1.02  index_cached_properties.IndexCache.time_is_all_dates('CategoricalIndex')
+       101±0.1ms        103±0.4ms     1.02  rolling.Apply.time_rolling('Series', 3, 'int', <function sum at 0x7ff1cd1ff040>, False)
+     5.94±0.01ms      6.06±0.01ms     1.02  io.hdf.HDFStoreDataFrame.time_read_store_table
+      71.6±0.3ms       73.0±0.3ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'float', <function sum at 0x7ff1cd1ff040>, False)
+     4.62±0.02ms      4.71±0.06ms     1.02  ctors.SeriesConstructors.time_series_constructor(<function gen_of_tuples at 0x7ff1b5092820>, False, 'float')
+         414±2ns          422±2ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'non_monotonic', True, 100000)
+         414±1ns          422±2ns     1.02  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int32Engine'>, <class 'numpy.int32'>), 'monotonic_decr', True, 100000)
+      90.6±0.2μs       92.3±0.5μs     1.02  tslibs.timestamp.TimestampOps.time_floor(datetime.timezone.utc)
+      73.0±0.5ms       74.3±0.1ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+     4.62±0.03ms      4.70±0.05ms     1.02  ctors.SeriesConstructors.time_series_constructor(<function gen_of_tuples at 0x7ff1b5092820>, False, 'int')
+      79.5±0.3μs       80.9±0.7μs     1.02  tslibs.timestamp.TimestampOps.time_floor(None)
+      71.8±0.2ms       72.9±0.1ms     1.02  rolling.Apply.time_rolling('Series', 300, 'float', <function sum at 0x7ff1cd1ff040>, False)
+       731±0.6ms          743±1ms     1.02  frame_methods.Iteration.time_itertuples_raw_tuples
+      68.5±0.7μs       69.6±0.7μs     1.02  ctors.SeriesConstructors.time_series_constructor(<function no_change at 0x7ff1b5045820>, True, 'float')
+      73.1±0.2ms       74.2±0.2ms     1.02  rolling.Apply.time_rolling('Series', 300, 'int', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+     4.22±0.03ms      4.28±0.06ms     1.01  ctors.SeriesConstructors.time_series_constructor(<function arr_dict at 0x7ff1b5092940>, True, 'float')
+      73.2±0.2ms       74.2±0.2ms     1.01  rolling.Apply.time_rolling('Series', 300, 'float', <function Apply.<lambda> at 0x7ff1b2310940>, False)
+         804±9μs          815±9μs     1.01  ctors.SeriesConstructors.time_series_constructor(<function list_of_str at 0x7ff1b50458b0>, True, 'int')
+      56.2±0.2ms       56.9±0.3ms     1.01  frame_methods.ToHTML.time_to_html_mixed
+       198±0.3ms        200±0.7ms     1.01  groupby.Cumulative.time_frame_transform('Float64', 'cumsum')
+       103±0.3ms       105±0.04ms     1.01  rolling.Apply.time_rolling('Series', 3, 'float', <function Apply.<lambda> at 0x7ff1b2310940>, False)
-         719±2μs        712±0.9μs     0.99  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation', 1)
-         128±1ms        127±0.8ms     0.99  index_cached_properties.IndexCache.time_engine('IntervalIndex')
-         535±2μs          529±2μs     0.99  indexing.CategoricalIndexIndexing.time_get_indexer_list('monotonic_decr')
-     5.39±0.01ms         5.33±0ms     0.99  rolling.Methods.time_method('Series', ('rolling', {'window': 1000}), 'float', 'count')
-         219±7μs          217±7μs     0.99  index_cached_properties.IndexCache.time_is_monotonic('UInt64Index')
-     55.2±0.09ms      54.6±0.05ms     0.99  strings.Cat.time_cat(3, None, '-', 0.0)
-     35.5±0.04ms      35.1±0.05ms     0.99  arithmetic.FrameWithFrameWide.time_op_different_blocks(<built-in function floordiv>, (1000000, 10))
-     1.68±0.02ms      1.66±0.01ms     0.99  index_cached_properties.IndexCache.time_is_all_dates('RangeIndex')
-     2.32±0.04ms      2.29±0.02ms     0.99  index_cached_properties.IndexCache.time_is_all_dates('IntervalIndex')
-      48.4±0.1ms       47.8±0.1ms     0.99  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float64', 5, 'monotone_misses')
-         129±1ms        127±0.7ms     0.99  index_cached_properties.IndexCache.time_is_monotonic_increasing('IntervalIndex')
-         840±2ns          828±5ns     0.99  dtypes.Dtypes.time_pandas_dtype(<class 'pandas.core.arrays.integer.UInt64Dtype'>)
-       320±0.7μs        316±0.6μs     0.99  groupby.GroupByMethods.time_dtype_as_field('object', 'bfill', 'direct', 1)
-      4.12±0.2ms      4.06±0.03ms     0.98  index_cached_properties.IndexCache.time_is_unique('MultiIndex')
-         632±2μs          622±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation', 1)
-      33.1±0.1ms       32.5±0.2ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'random_misses')
-      33.0±0.2ms       32.5±0.1ms     0.98  rolling.Rank.time_rank('Series', 10, 'float', True, False, 'min')
-      49.5±0.1μs       48.7±0.2μs     0.98  series_methods.NanOps.time_func('sum', 1000, 'float64')
-         392±1μs          385±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'direct', 5)
-         889±4μs          874±7μs     0.98  frame_ctor.FromRecords.time_frame_from_records_generator(1000)
-       217±0.6ns          213±3ns     0.98  libs.ScalarListLike.time_is_scalar(array('123', dtype='<U3'))
-     33.8±0.09ms      33.2±0.08ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('int32', 5, 'monotone_hits')
-      33.0±0.1ms       32.4±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'monotone_hits')
-     1.37±0.01ms      1.35±0.01ms     0.98  groupby.RankWithTies.time_rank_ties('float32', 'dense')
-       227±0.8μs        223±0.3μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'direct', 1)
-         208±1μs        204±0.3μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'bfill', 'direct', 1)
-       203±0.6ns          199±2ns     0.98  libs.ScalarListLike.time_is_scalar((1+2j))
-      34.4±0.2ms      33.7±0.04ms     0.98  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0.5, 'midpoint')
-     1.08±0.01ms      1.06±0.01ms     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'pct_change', 'direct', 1)
-      51.9±0.2ms       50.8±0.5ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'describe', 'direct', 5)
-      34.1±0.2ms       33.4±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('int32', 5, 'random_misses')
-       164±0.8ms        161±0.3ms     0.98  io.hdf.HDFStoreDataFrame.time_write_store_table_dc
-     1.02±0.01ms         1.00±0ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'pct_change', 'direct', 1)
-       221±0.6μs        217±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct', 1)
-         495±2μs          485±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'sem', 'direct', 5)
-      41.0±0.1μs       40.2±0.3μs     0.98  tslibs.timestamp.TimestampOps.time_normalize(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-       227±0.7μs          222±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'ffill', 'direct', 1)
-       256±0.5μs          251±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'bfill', 'direct', 5)
-      40.0±0.1μs       39.2±0.2μs     0.98  series_methods.NanOps.time_func('max', 1000, 'int8')
-      33.0±0.1ms       32.3±0.1ms     0.98  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'random_hits')
-         281±1ms        275±0.9ms     0.98  reshape.WideToLong.time_wide_to_long_big
-         426±3μs          417±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct', 1)
-         451±2ns          441±1ns     0.98  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int64Engine'>, <class 'numpy.int64'>), 'monotonic_decr', True, 100000)
-     3.61±0.01ms      3.53±0.02ms     0.98  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'midpoint')
-         414±3μs        405±0.8μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'sem', 'direct', 1)
-         844±4ns          824±2ns     0.98  dtypes.Dtypes.time_pandas_dtype(<class 'pandas.core.arrays.integer.Int8Dtype'>)
-      34.2±0.2ms       33.4±0.2ms     0.98  rolling.Methods.time_method('Series', ('rolling', {'window': 10}), 'int', 'median')
-      20.1±0.2μs       19.7±0.1μs     0.98  series_methods.NanOps.time_func('argmax', 1000, 'int8')
-         660±4ns          644±2ns     0.98  tslibs.timestamp.TimestampOps.time_to_pydatetime(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-     2.68±0.03ms         2.62±0ms     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'pct_change', 'direct', 5)
-      29.4±0.1μs       28.7±0.2μs     0.98  series_methods.NanOps.time_func('prod', 1000, 'int32')
-         418±2μs        408±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'sem', 'direct', 1)
-        1.10±0ms         1.07±0ms     0.98  groupby.FillNA.time_srs_ffill
-         262±1μs        256±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_field('uint', 'bfill', 'direct', 5)
-         506±1ns          494±2ns     0.98  tslibs.timestamp.TimestampProperties.time_dayofweek(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>, None)
-      54.9±0.1ms       53.6±0.2ms     0.98  io.csv.ReadCSVSkipRows.time_skipprows(10000, 'python')
-     1.38±0.01ms         1.34±0ms     0.98  groupby.RankWithTies.time_rank_ties('float32', 'average')
-     3.80±0.01ms      3.70±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'min')
-     33.5±0.08ms       32.6±0.1ms     0.97  algos.isin.IsInLongSeriesLookUpDominates.time_isin('float32', 5, 'monotone_misses')
-     4.28±0.01ms      4.17±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'kurt')
-         234±2μs        228±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_field('uint', 'bfill', 'direct', 1)
-     3.81±0.02ms      3.71±0.02ms     0.97  libs.InferDtype.time_infer_dtype('py-object')
-        2.89±0ms      2.81±0.01ms     0.97  indexing.IntervalIndexing.time_getitem_scalar
-       255±0.9μs          248±1μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'ffill', 'direct', 5)
-     1.74±0.01ms         1.70±0ms     0.97  rolling.Pairwise.time_pairwise(({'window': 1000}, 'rolling'), 'corr', False)
-       258±0.9μs          252±2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'tail', 'direct', 5)
-         428±3μs        417±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct', 1)
-     4.28±0.02ms      4.17±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'kurt')
-       217±0.5ns          211±3ns     0.97  libs.ScalarListLike.time_is_scalar((1, 2, 3))
-         231±3μs        224±0.7μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'bfill', 'direct', 1)
-     2.80±0.01ms         2.72±0ms     0.97  series_methods.NSort.time_nlargest('all')
-      21.1±0.1ms      20.5±0.06ms     0.97  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'direct', 1)
-         175±1ms          170±2ms     0.97  strings.Extract.time_extract_single_group('string[pyarrow]', True)
-     4.05±0.02ms      3.94±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'min')
-     3.66±0.01ms      3.56±0.02ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'nearest')
-     4.09±0.01ms      3.98±0.03ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'max')
-     7.00±0.08μs      6.80±0.08μs     0.97  tslibs.period.TimeDT64ArrToPeriodArr.time_dt64arr_to_periodarr(0, 2000, tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-      21.2±0.1ms       20.6±0.2ms     0.97  io.sql.WriteSQLDtypes.time_to_sql_dataframe_column('sqlite', 'float_with_nan')
-     4.08±0.01ms      3.96±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'max')
-     3.76±0.01ms         3.64±0ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'max')
-     5.53±0.03ms      5.37±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'count')
-     10.7±0.06μs      10.4±0.03μs     0.97  timedelta.TimedeltaIndexing.time_series_loc
-     1.28±0.01ms      1.24±0.01ms     0.97  rolling.Pairwise.time_pairwise(({'window': 10}, 'rolling'), 'cov', False)
-     3.69±0.01ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'skew')
-     3.66±0.01ms      3.55±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'linear')
-     3.62±0.02ms      3.51±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'nearest')
-     4.20±0.01ms      4.08±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'max')
-     3.97±0.01ms      3.85±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'min')
-     3.69±0.02ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'min')
-     3.56±0.01ms      3.45±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'std')
-      22.0±0.2ms      21.3±0.09ms     0.97  stat_ops.SeriesMultiIndexOps.time_op(1, 'skew')
-     4.15±0.03ms      4.02±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'min')
-         144±1ms        140±0.5ms     0.97  plotting.FramePlotting.time_frame_plot('hist')
-         634±4μs        615±0.5μs     0.97  indexing.NonNumericSeriesIndexing.time_getitem_list_like('datetime', 'nonunique_monotonic_inc')
-     4.05±0.01ms      3.93±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'min')
-     3.66±0.02ms         3.55±0ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'midpoint')
-     3.67±0.01ms      3.55±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'max')
-     3.69±0.02ms      3.57±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0, 'higher')
-     14.5±0.04ms      14.0±0.07ms     0.97  groupby.AggFunctions.time_different_numpy_functions
-     2.66±0.02ms      2.58±0.02ms     0.97  io.csv.ReadCSVParseDates.time_multiple_date('python')
-     2.62±0.01ms      2.54±0.01ms     0.97  series_methods.NSort.time_nlargest('last')
-     3.74±0.03ms      3.62±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'max')
-     3.63±0.02ms      3.51±0.02ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'linear')
-     4.02±0.01ms      3.89±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'max')
-     3.86±0.01ms      3.74±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'max')
-     5.48±0.02ms      5.30±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'count')
-      19.9±0.1ms       19.2±0.1ms     0.97  io.sql.WriteSQLDtypes.time_to_sql_dataframe_column('sqlite', 'int')
-     3.70±0.01ms      3.58±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'skew')
-     3.99±0.03ms      3.86±0.01ms     0.97  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '.', None)
-     4.63±0.02ms      4.48±0.02ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'kurt')
-     3.74±0.02ms      3.61±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 1, 'midpoint')
-      9.14±0.1μs      8.84±0.02μs     0.97  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(100, tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-     5.29±0.03ms      5.11±0.03ms     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'nunique', 'transformation', 5)
-      46.4±0.4ms       44.9±0.3ms     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 1)
-     3.69±0.01ms      3.56±0.01ms     0.97  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'higher')
-      96.7±0.3μs       93.4±0.2μs     0.97  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'direct', 1)
-     3.36±0.02ms      3.24±0.01ms     0.97  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'min')
-     3.57±0.01ms      3.45±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'std')
-     4.54±0.02ms      4.38±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'kurt')
-     3.99±0.02ms      3.85±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'max')
-     3.64±0.02ms      3.51±0.01ms     0.97  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'min')
-     3.13±0.01ms      3.02±0.02ms     0.97  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'max')
-         150±1ms        145±0.9ms     0.97  stat_ops.SeriesMultiIndexOps.time_op([0, 1], 'kurt')
-       253±0.4μs          244±2μs     0.97  join_merge.Concat.time_concat_empty_right(0)
-        4.03±0ms      3.89±0.01ms     0.97  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'min')
-     1.29±0.01ms         1.24±0ms     0.97  stat_ops.FrameOps.time_op('prod', 'Int64', 0)
-      28.2±0.1ms       27.2±0.3ms     0.96  rolling.Groupby.time_method('sum', ('rolling', {'window': '30s', 'on': 'C'}))
-     9.80±0.08ms      9.45±0.04ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'sem')
-     2.32±0.02ms      2.24±0.02ms     0.96  io.csv.ReadCSVParseDates.time_multiple_date('c')
-     4.04±0.03ms      3.89±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'skew')
-       267±0.7μs          257±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'tail', 'direct', 5)
-     3.34±0.01ms      3.23±0.01ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'max')
-     3.30±0.01ms         3.19±0ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'min')
-     2.83±0.01ms      2.73±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'skew')
-     2.43±0.01ms      2.34±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'linear')
-     3.97±0.01ms         3.83±0ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'skew')
-     9.89±0.06ms      9.53±0.06ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'sem')
-      3.41±0.2μs       3.29±0.2μs     0.96  index_cached_properties.IndexCache.time_values('TimedeltaIndex')
-     4.65±0.01ms      4.48±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'kurt')
-        1.13±0ms      1.09±0.01ms     0.96  stat_ops.FrameOps.time_op('sum', 'Int64', 0)
-     3.52±0.07ms      3.39±0.02ms     0.96  index_cached_properties.IndexCache.time_is_unique('Float64Index')
-     1.41±0.01ms      1.36±0.01ms     0.96  rolling.Apply.time_rolling('DataFrame', 3, 'int', <built-in function sum>, True)
-     4.42±0.03ms      4.26±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'kurt')
-      98.1±0.5μs       94.5±0.4μs     0.96  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct', 1)
-     2.57±0.01ms      2.48±0.04ms     0.96  series_methods.NSort.time_nsmallest('all')
-      21.1±0.2ms      20.3±0.04ms     0.96  groupby.GroupByMethods.time_dtype_as_field('int', 'describe', 'direct', 1)
-     5.59±0.07ms      5.38±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'count')
-     4.03±0.02ms      3.88±0.01ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'skew')
-     6.28±0.02ms      6.05±0.02ms     0.96  index_object.SetOperations.time_operation('int', 'symmetric_difference')
-     12.4±0.03μs      11.9±0.04μs     0.96  tslibs.tz_convert.TimeTZConvert.time_tz_localize_to_utc(1, tzlocal())
-     2.42±0.02μs      2.33±0.01μs     0.96  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.UInt64Engine'>, <class 'numpy.uint64'>), 'monotonic_decr', True, 2000000)
-         270±2μs          259±4μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct', 5)
-         218±1μs          209±1μs     0.96  join_merge.Concat.time_concat_empty_right(1)
-      22.5±0.3μs       21.6±0.1μs     0.96  series_methods.All.time_all(1000, 'fast', 'bool')
-     3.48±0.02ms      3.34±0.02ms     0.96  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'std')
-     3.75±0.02ms      3.60±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 1, 'linear')
-      9.87±0.1ms      9.48±0.04ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'sem')
-     3.43±0.02ms      3.30±0.01ms     0.96  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'max')
-     36.2±0.09ms      34.8±0.08ms     0.96  groupby.GroupByMethods.time_dtype_as_group('uint', 'describe', 'direct', 1)
-      35.5±0.5μs       34.1±0.3μs     0.96  series_methods.NanOps.time_func('argmax', 1000, 'float64')
-      30.2±0.5μs       28.9±0.1μs     0.96  series_methods.NanOps.time_func('prod', 1000, 'int8')
-     1.53±0.01ms      1.47±0.01ms     0.96  rolling.GroupbyEWM.time_groupby_method('var')
-     3.71±0.03ms      3.56±0.02ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'float', 0, 'midpoint')
-        1.42±0ms      1.36±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'min')
-     2.30±0.01ms      2.21±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'lower')
-     1.40±0.04ms      1.34±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('float64', 'dense')
-         252±1μs          242±2μs     0.96  join_merge.Concat.time_concat_empty_left(0)
-      77.8±0.4ms       74.6±0.6ms     0.96  io.csv.ReadCSVSkipRows.time_skipprows(None, 'python')
-        2.44±0ms      2.33±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'nearest')
-      36.1±0.2ms       34.6±0.1ms     0.96  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 1)
-     3.33±0.01ms      3.20±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'std')
-        1.42±0ms      1.36±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'max')
-     2.46±0.01ms      2.36±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'lower')
-     1.79±0.01ms      1.71±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'transformation', 5)
-     1.41±0.01ms      1.35±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'dense')
-     1.78±0.01ms      1.71±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'ffill', 'transformation', 5)
-     2.47±0.01ms         2.36±0ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'linear')
-       107±0.3ms        103±0.6ms     0.96  frame_methods.Apply.time_apply_axis_1
-     3.09±0.01ms      2.96±0.03ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'min')
-     1.89±0.02ms      1.81±0.01ms     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'transformation', 5)
-      87.9±0.3ms       84.1±0.7ms     0.96  strings.Methods.time_partition('str')
-         176±1μs        168±0.9μs     0.96  groupby.GroupByMethods.time_dtype_as_group('uint', 'head', 'direct', 5)
-     3.26±0.02ms      3.12±0.02ms     0.96  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'kurt')
-      3.70±0.2μs       3.54±0.2μs     0.96  index_cached_properties.IndexCache.time_values('UInt64Index')
-     5.09±0.04ms      4.87±0.02ms     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'transformation', 5)
-     2.43±0.01ms      2.32±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'midpoint')
-     2.18±0.01ms      2.08±0.01ms     0.96  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'mean')
-      79.8±0.9μs       76.2±0.6μs     0.96  indexing.DataFrameNumericIndexing.time_iloc_dups
-     2.47±0.01ms      2.36±0.01ms     0.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'higher')
-     1.05±0.05μs      1.01±0.03μs     0.95  index_cached_properties.IndexCache.time_is_monotonic_decreasing('RangeIndex')
-         222±2ms        212±0.8ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 5)
-     1.43±0.01ms      1.36±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'shift', 'transformation', 5)
-     13.6±0.08ms      13.0±0.03ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'transformation', 1)
-         294±2ms          280±1ms     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 5)
-     3.19±0.02ms      3.04±0.03ms     0.95  join_merge.Join.time_join_dataframes_cross(False)
-      3.80±0.2μs       3.62±0.2μs     0.95  index_cached_properties.IndexCache.time_inferred_type('IntervalIndex')
-     10.9±0.06ms      10.4±0.03ms     0.95  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'transformation', 5)
-     2.46±0.01ms         2.35±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'nearest')
-     9.45±0.04ms      9.02±0.04ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'direct', 5)
-         509±2μs          485±1μs     0.95  groupby.GroupByMethods.time_dtype_as_field('uint', 'sem', 'direct', 5)
-     2.44±0.02ms         2.33±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 1, 'higher')
-       170±0.7ms        162±0.5ms     0.95  io.stata.Stata.time_write_stata('tw')
-     2.33±0.01ms         2.22±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'higher')
-         575±2ms          548±4ms     0.95  stat_ops.FrameMultiIndexOps.time_op([0, 1], 'kurt')
-       148±0.7ms        141±0.7ms     0.95  stat_ops.SeriesMultiIndexOps.time_op([0, 1], 'skew')
-     2.76±0.05μs      2.63±0.01μs     0.95  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('datetime', 1, None)
-     2.34±0.06μs      2.23±0.08μs     0.95  index_cached_properties.IndexCache.time_shape('DatetimeIndex')
-        36.4±1ms      34.7±0.05ms     0.95  stat_ops.FrameOps.time_op('sum', 'Int64', 1)
-     9.33±0.07ms      8.89±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'transformation', 1)
-     2.34±0.01ms         2.23±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'midpoint')
-        1.45±0ms      1.38±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'transformation', 5)
-     2.33±0.02ms         2.22±0ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'linear')
-      20.4±0.2ms      19.4±0.08ms     0.95  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'direct', 1)
-      13.3±0.1ms      12.6±0.06ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'direct', 1)
-        39.1±1ms       37.2±0.2ms     0.95  stat_ops.FrameOps.time_op('mean', 'Int64', 1)
-      7.43±0.4μs       7.08±0.3μs     0.95  index_cached_properties.IndexCache.time_inferred_type('Float64Index')
-     2.15±0.01ms      2.05±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'mean')
-      35.9±0.3ms       34.2±0.7ms     0.95  io.sql.SQL.time_read_sql_query('sqlalchemy')
-     1.55±0.02ms      1.47±0.01ms     0.95  rolling.GroupbyEWMEngine.time_groupby_mean('cython')
-     5.26±0.03ms      5.01±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'nunique', 'transformation', 5)
-        602±10μs         573±20μs     0.95  index_cached_properties.IndexCache.time_is_monotonic('MultiIndex')
-        2.34±0ms      2.22±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'nearest')
-     8.83±0.08ms      8.40±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_field('int', 'skew', 'direct', 1)
-     1.24±0.01ms      1.18±0.01ms     0.95  stat_ops.FrameOps.time_op('mean', 'Int64', 0)
-      14.7±0.2ms      14.0±0.03ms     0.95  groupby.AggFunctions.time_different_str_functions
-     3.23±0.01ms      3.07±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'std')
-     2.39±0.02ms      2.27±0.01ms     0.95  series_methods.NSort.time_nsmallest('first')
-            207M             197M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_int_floats')
-        2.26±0ms      2.15±0.01ms     0.95  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'std'), 'float')
-      10.9±0.5μs       10.4±0.3μs     0.95  index_cached_properties.IndexCache.time_engine('UInt64Index')
-         223±1ms          212±1ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'describe', 'direct', 5)
-     3.25±0.02ms      3.09±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'std')
-        2.44±0ms      2.32±0.04ms     0.95  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'std'), 'int')
-      13.7±0.1ms      13.0±0.05ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'skew', 'transformation', 1)
-     2.16±0.04μs      2.05±0.01μs     0.95  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(100, datetime.timezone.utc)
-     2.33±0.01ms      2.22±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'lower')
-            208M             198M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_int_float_str')
-            203M             193M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_td_int_ts')
-      11.1±0.4μs       10.5±0.3μs     0.95  index_cached_properties.IndexCache.time_engine('TimedeltaIndex')
-       208±0.6ms        198±0.6ms     0.95  join_merge.MergeCategoricals.time_merge_cat
-     2.50±0.01ms      2.37±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'mean')
-      22.6±0.3μs       21.4±0.2μs     0.95  series_methods.Any.time_any(1000, 'slow', 'bool')
-        2.51±0ms      2.38±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'mean')
-     2.44±0.01ms      2.32±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'int', 'sum')
-     4.31±0.03ms      4.09±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'nunique', 'transformation', 5)
-     1.70±0.01ms      1.61±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('uint', 'ffill', 'transformation', 5)
-         611±2μs          580±6μs     0.95  indexing.NonNumericSeriesIndexing.time_getitem_list_like('string', 'nonunique_monotonic_inc')
-     2.65±0.02ms      2.51±0.02ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'mean')
-     2.30±0.01ms      2.18±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'mean')
-            197M             187M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_int_floats')
-      16.1±0.3ms      15.2±0.07ms     0.95  groupby.Nth.time_frame_nth('float64')
-            197M             187M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_int_floats')
-      9.70±0.1ms      9.19±0.04ms     0.95  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'transformation', 1)
-      3.62±0.2μs       3.43±0.2μs     0.95  index_cached_properties.IndexCache.time_values('Float64Index')
-     2.98±0.01ms      2.82±0.01ms     0.95  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'kurt')
-     2.97±0.01ms         2.81±0ms     0.95  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'kurt')
-     3.39±0.03ms      3.21±0.01ms     0.95  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'kurt')
-     1.45±0.01ms      1.38±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'transformation', 5)
-     2.32±0.04ms      2.19±0.01ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'higher')
-     1.13±0.02ms      1.07±0.01ms     0.95  groupby.FillNA.time_df_ffill
-     13.3±0.06ms      12.6±0.08ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'direct', 1)
-            198M             188M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_int_float_str')
-            198M             188M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_int_float_str')
-            193M             183M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_td_int_ts')
-            193M             183M     0.95  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_td_int_ts')
-        603±10μs         571±20μs     0.95  index_cached_properties.IndexCache.time_is_monotonic_increasing('MultiIndex')
-      15.9±0.3ms       15.1±0.1ms     0.95  io.csv.ReadCSVParseSpecialDate.time_read_special_date('hm', 'python')
-     3.26±0.03ms      3.09±0.02ms     0.95  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'min')
-     2.33±0.04ms      2.20±0.02ms     0.95  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'linear')
-        35.0±1μs       33.1±0.2μs     0.95  tslibs.timestamp.TimestampOps.time_replace_tz(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)
-     2.64±0.02ms      2.50±0.01ms     0.95  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'int', 'mean')
-     3.27±0.03μs      3.10±0.05μs     0.95  index_object.Indexing.time_get_loc_sorted('Int')
-     1.71±0.01ms      1.61±0.01ms     0.95  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'transformation', 5)
-     2.15±0.01ms      2.03±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'std')
-      8.92±0.1ms      8.42±0.04ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'direct', 1)
-     6.57±0.04μs       6.20±0.2μs     0.94  tslibs.timestamp.TimestampOps.time_replace_None(<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)
-     9.81±0.09ms      9.27±0.02ms     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'direct', 5)
-     2.04±0.05μs      1.92±0.01μs     0.94  tslibs.tz_convert.TimeTZConvert.time_tz_convert_from_utc(1, datetime.timezone.utc)
-     2.15±0.01ms      2.03±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'max')
-     2.46±0.02ms      2.33±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'int', 'sum')
-     2.32±0.01ms      2.19±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1h', 'float', 'sum')
-     5.30±0.01ms         5.00±0ms     0.94  groupby.GroupByMethods.time_dtype_as_group('int', 'nunique', 'transformation', 5)
-     1.69±0.08μs       1.60±0.1μs     0.94  index_cached_properties.IndexCache.time_inferred_type('PeriodIndex')
-      9.41±0.1ms      8.88±0.03ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'transformation', 1)
-            181M             170M     0.94  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_td_int_ts')
-     2.99±0.02ms      2.82±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'skew')
-            181M             170M     0.94  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_td_int_ts')
-     9.58±0.09ms      9.03±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_field('uint', 'skew', 'direct', 5)
-     1.81±0.01ms      1.70±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'transformation', 5)
-      31.7±0.1ms       29.9±0.1ms     0.94  groupby.TransformEngine.time_series_cython(True)
-     1.68±0.01ms         1.58±0ms     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'transformation', 5)
-     3.26±0.01μs      3.07±0.04μs     0.94  index_object.Indexing.time_get_loc('Int')
-        2.34±0ms      2.21±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'sum')
-      20.2±0.1ms       19.1±0.1ms     0.94  stat_ops.FrameMultiIndexOps.time_op(0, 'skew')
-     1.71±0.02ms      1.62±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('uint', 'bfill', 'transformation', 5)
-      3.14±0.1ms      2.96±0.03ms     0.94  index_cached_properties.IndexCache.time_is_unique('DatetimeIndex')
-      21.0±0.3ms       19.8±0.1ms     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'transformation', 1)
-     9.25±0.09ms       8.72±0.1ms     0.94  groupby.GroupByMethods.time_dtype_as_field('float', 'skew', 'direct', 1)
-     1.57±0.01ms      1.48±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'transformation', 5)
-     1.83±0.01ms      1.72±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'mean')
-      76.6±0.4μs       72.1±0.4μs     0.94  series_methods.ToFrame.time_to_frame('Int64', None)
-     2.38±0.08μs      2.24±0.01μs     0.94  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Float32Engine'>, <class 'numpy.float32'>), 'monotonic_incr', False, 100000)
-     2.33±0.01ms      2.19±0.01ms     0.94  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'sum')
-     1.98±0.01ms      1.86±0.01ms     0.94  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'min')
-      76.6±0.1μs       72.0±0.2μs     0.94  series_methods.ToFrame.time_to_frame('int64', None)
-      77.6±0.8μs       73.0±0.1μs     0.94  series_methods.ToFrame.time_to_frame('category', None)
-     1.99±0.04ms      1.87±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'sum')
-     19.9±0.06ms      18.7±0.05ms     0.94  join_merge.MergeAsof.time_on_int32('nearest', 5)
-     1.56±0.01ms      1.47±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'ffill', 'transformation', 5)
-     2.33±0.03μs      2.19±0.05μs     0.94  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('time', 1, datetime.timezone.utc)
-     19.2±0.05ms      18.0±0.05ms     0.94  join_merge.MergeAsof.time_on_int('nearest', 5)
-     2.26±0.01ms      2.12±0.01ms     0.94  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'std'), 'float')
-      31.7±0.3ms       29.8±0.2ms     0.94  groupby.TransformEngine.time_series_cython(False)
-     1.53±0.02ms      1.43±0.01ms     0.94  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation', 5)
-        852±50ns         799±20ns     0.94  index_cached_properties.IndexCache.time_shape('Int64Index')
-     10.9±0.06ms      10.2±0.02ms     0.94  io.csv.ReadCSVConcatDatetimeBadDateValue.time_read_csv('0')
-     2.05±0.01ms      1.92±0.01ms     0.94  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'std')
-      3.17±0.2μs       2.97±0.2μs     0.94  index_cached_properties.IndexCache.time_values('CategoricalIndex')
-      4.32±0.2μs       4.05±0.2μs     0.94  index_cached_properties.IndexCache.time_shape('IntervalIndex')
-     18.0±0.03ms      16.9±0.06ms     0.94  join_merge.MergeAsof.time_on_uint64('nearest', 5)
-        841±40ns         788±40ns     0.94  index_cached_properties.IndexCache.time_shape('RangeIndex')
-     6.40±0.08μs       6.00±0.1μs     0.94  tslibs.timestamp.TimestampOps.time_replace_None(tzfile('/usr/share/zoneinfo/Asia/Tokyo'))
-         210±1μs          197±1μs     0.94  groupby.GroupByMethods.time_dtype_as_group('object', 'tail', 'direct', 5)
-     19.2±0.09ms      17.9±0.03ms     0.94  join_merge.MergeAsof.time_on_int32('nearest', None)
-        2.44±0ms      2.28±0.02ms     0.94  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'std'), 'int')
-     18.7±0.09ms      17.5±0.05ms     0.94  join_merge.MergeAsof.time_on_int('nearest', None)
-       165±0.9ms        154±0.3ms     0.94  strings.Split.time_split('str', True)
-     1.16±0.02ms      1.08±0.01ms     0.94  groupby.FillNA.time_df_bfill
-     17.3±0.09ms      16.2±0.08ms     0.93  join_merge.MergeAsof.time_on_uint64('nearest', None)
-     2.15±0.03ms         2.01±0ms     0.93  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'int', 'sum')
-      77.7±0.9μs       72.6±0.1μs     0.93  series_methods.ToFrame.time_to_frame('category', 'foo')
-      1.80±0.2μs      1.68±0.07μs     0.93  index_cached_properties.IndexCache.time_values('DatetimeIndex')
-        59.4±1ms       55.5±0.2ms     0.93  stat_ops.FrameOps.time_op('skew', 'Int64', 1)
-      3.39±0.2μs       3.17±0.2μs     0.93  index_cached_properties.IndexCache.time_values('IntervalIndex')
-     2.01±0.01ms      1.87±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 10}), 'float', 'sum')
-     1.96±0.02ms         1.83±0ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'mean')
-     1.29±0.01ms      1.20±0.01ms     0.93  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'mean'), 'int')
-     5.68±0.05ms      5.30±0.04ms     0.93  indexing.MultiIndexing.time_index_slice
-     2.55±0.03μs      2.38±0.02μs     0.93  tslibs.tslib.TimeIntsToPydatetime.time_ints_to_pydatetime('time', 1, None)
-            212M             198M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_int_floats')
-      3.77±0.2μs       3.52±0.2μs     0.93  index_cached_properties.IndexCache.time_inferred_type('CategoricalIndex')
-            207M             193M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_date_idx')
-            206M             192M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df_date_idx')
-            213M             199M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_int_float_str')
-            210M             196M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df_td_int_ts')
-            208M             193M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_int_floats')
-         289±2ms          269±3ms     0.93  groupby.GroupByCythonAgg.time_frame_agg('float64', 'median')
-            204M             190M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_int_floats')
-            208M             194M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_int_float_str')
-     1.96±0.03ms      1.82±0.01ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'mean')
-            199M             185M     0.93  io.json.ToJSONWide.peakmem_to_json('columns', 'df')
-      77.9±0.4ms       72.4±0.5ms     0.93  stat_ops.FrameMultiIndexOps.time_op(1, 'kurt')
-            199M             185M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_date_idx')
-            204M             189M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df_td_int_ts')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('records', 'df_date_idx')
-            198M             184M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('index', 'df_date_idx')
-     1.69±0.01ms      1.57±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'sum')
-            197M             183M     0.93  io.json.ToJSONWide.peakmem_to_json('index', 'df')
-            196M             182M     0.93  io.json.ToJSONWide.peakmem_to_json_wide('columns', 'df')
-            200M             186M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_td_int_ts')
-     1.61±0.01ms      1.50±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'mean')
-      33.0±0.2ms       30.6±0.2ms     0.93  groupby.TransformEngine.time_dataframe_cython(True)
-            195M             181M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df')
-            195M             181M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_date_idx')
-            205M             190M     0.93  io.json.ToJSONWide.peakmem_to_json('records', 'df_int_float_str')
-     1.65±0.01ms         1.53±0ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'float', 'sum')
-            194M             180M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_date_idx')
-         128±1μs        119±0.7μs     0.93  groupby.GroupByMethods.time_dtype_as_field('uint', 'shift', 'direct', 5)
-      4.44±0.2μs       4.11±0.1μs     0.93  index_cached_properties.IndexCache.time_engine('PeriodIndex')
-     1.31±0.01ms      1.22±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'transformation', 5)
-     1.86±0.04ms      1.73±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('int', 'cumcount', 'transformation', 5)
-            196M             182M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_int_floats')
-     1.29±0.01ms      1.19±0.01ms     0.93  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'mean'), 'int')
-     1.47±0.01ms      1.36±0.01ms     0.93  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation', 5)
-         115±1μs          107±1μs     0.93  groupby.GroupByMethods.time_dtype_as_field('uint', 'shift', 'direct', 1)
-     1.65±0.01ms      1.52±0.01ms     0.93  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'sum')
-     15.3±0.08ms      14.2±0.03ms     0.93  join_merge.MergeAsof.time_on_int('forward', 5)
-            188M             174M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df')
-            187M             173M     0.93  io.json.ToJSONWide.peakmem_to_json('values', 'df')
-            197M             182M     0.93  io.json.ToJSONWide.peakmem_to_json('split', 'df_int_float_str')
-     1.55±0.01ms      1.44±0.01ms     0.93  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'sum')
-       123±0.9μs        114±0.5μs     0.93  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct', 5)
-            187M             173M     0.93  io.json.ToJSONWide.peakmem_to_json('values', 'df_date_idx')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_date_idx')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_int_floats')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_date_idx')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_int_floats')
-     1.04±0.01ms          960±6μs     0.92  groupby.GroupByMethods.time_dtype_as_group('object', 'cumcount', 'direct', 5)
-     1.07±0.01ms          994±5μs     0.92  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'direct', 5)
-      72.7±0.2ms       67.2±0.3ms     0.92  join_merge.MergeOrdered.time_merge_ordered
-            207M             192M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_int_float_str')
-            190M             176M     0.92  io.json.ToJSONWide.peakmem_to_json('split', 'df_td_int_ts')
-            189M             175M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_int_floats')
-            206M             191M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_int_floats')
-     1.74±0.01ms      1.61±0.01ms     0.92  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'int', 'mean')
-            203M             188M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_date_idx')
-            204M             188M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df_td_int_ts')
-            187M             173M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_td_int_ts')
-            190M             176M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('split', 'df_int_float_str')
-            190M             175M     0.92  io.json.ToJSONWide.peakmem_to_json_wide('values', 'df_int_float_str')
-      4.05±0.2μs       3.74±0.2μs     0.92  index_cached_properties.IndexCache.time_shape('Float64Index')
-     2.16±0.03ms      1.99±0.01ms     0.92  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'int', 'sum')
-      3.63±0.1μs       3.35±0.1μs     0.92  index_cached_properties.IndexCache.time_inferred_type('MultiIndex')
-            202M             186M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_int_float_str')
-            202M             186M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_int_floats')
-      7.97±0.3μs       7.36±0.3μs     0.92  index_cached_properties.IndexCache.time_inferred_type('UInt64Index')
-     1.06±0.02ms          980±4μs     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cumcount', 'direct', 5)
-       108±0.7μs      100.0±0.4μs     0.92  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'direct', 1)
-        808±40ns          745±4ns     0.92  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(100, 12000)
-            199M             183M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_int_float_str')
-      69.6±0.6ms       64.2±0.3ms     0.92  groupby.GroupByMethods.time_dtype_as_field('datetime', 'unique', 'direct', 1)
-            190M             175M     0.92  io.json.ToJSONWide.peakmem_to_json('values', 'df_int_float_str')
-            198M             183M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_int_floats')
-     1.10±0.01ms      1.01±0.01ms     0.92  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumcount', 'direct', 5)
-       106±0.5μs       97.4±0.7μs     0.92  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'direct', 1)
-      38.6±0.2ms       35.5±0.4ms     0.92  groupby.GroupByMethods.time_dtype_as_field('uint', 'unique', 'direct', 1)
-            195M             180M     0.92  io.json.ToJSON.peakmem_to_json('columns', 'df')
-            197M             181M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_td_int_ts')
-            195M             179M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df_date_idx')
-        463±20μs          426±4μs     0.92  arithmetic.NumericInferOps.time_multiply(<class 'numpy.uint32'>)
-            193M             178M     0.92  io.json.ToJSON.peakmem_to_json('index', 'df')
-       110±0.6μs        101±0.8μs     0.92  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct', 1)
-            193M             178M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_td_int_ts')
-     15.2±0.01ms      14.0±0.08ms     0.92  join_merge.MergeAsof.time_on_int('forward', None)
-            190M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_date_idx')
-            191M             176M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df')
-            191M             176M     0.92  io.json.ToJSON.peakmem_to_json('records', 'df_date_idx')
-            190M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_int_floats')
-        1.17±0ms         1.08±0ms     0.92  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 1000}, 'mean'), 'float')
-            191M             175M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df_int_float_str')
-      3.98±0.2μs       3.66±0.1μs     0.92  index_cached_properties.IndexCache.time_shape('CategoricalIndex')
-      16.4±0.1ms      15.1±0.09ms     0.92  join_merge.MergeAsof.time_on_int32('forward', 5)
-         696±9μs          638±5μs     0.92  groupby.Shift.time_fill_value
-     1.42±0.01ms      1.30±0.01ms     0.92  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'transformation', 5)
-            184M             169M     0.92  io.json.ToJSON.peakmem_to_json('split', 'df')
-         111±2μs        102±0.7μs     0.92  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct', 1)
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df')
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_date_idx')
-     25.8±0.05ms      23.6±0.05ms     0.92  stat_ops.FrameMultiIndexOps.time_op(0, 'kurt')
-      38.7±0.3ms       35.4±0.1ms     0.92  groupby.GroupByMethods.time_dtype_as_field('int', 'unique', 'direct', 1)
-        1.18±0ms         1.08±0ms     0.92  rolling.EWMMethods.time_ewm('DataFrame', ({'halflife': 10}, 'mean'), 'float')
-       122±0.7ms        112±0.6ms     0.92  strings.Split.time_rsplit('str', True)
-            184M             169M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_int_float_str')
-            183M             168M     0.92  io.json.ToJSON.peakmem_to_json('values', 'df_int_floats')
-      56.7±0.3ms       51.9±0.7ms     0.92  groupby.GroupByMethods.time_dtype_as_group('uint', 'unique', 'direct', 1)
-            183M             168M     0.91  io.json.ToJSON.peakmem_to_json('split', 'df_td_int_ts')
-            180M             165M     0.91  io.json.ToJSON.peakmem_to_json('values', 'df_td_int_ts')
-     14.5±0.05ms      13.3±0.08ms     0.91  join_merge.MergeAsof.time_on_uint64('forward', 5)
-     1.81±0.03ms      1.65±0.01ms     0.91  rolling.ForwardWindowMethods.time_rolling('DataFrame', 10, 'int', 'sum')
-     13.7±0.04ms      12.5±0.06ms     0.91  join_merge.MergeAsof.time_on_int('backward', 5)
-      89.5±0.5ms       81.7±0.6ms     0.91  groupby.GroupByMethods.time_dtype_as_group('float', 'unique', 'direct', 1)
-        834±40ns          761±5ns     0.91  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(1000000, 12000)
-      4.17±0.2μs       3.80±0.2μs     0.91  index_cached_properties.IndexCache.time_shape('UInt64Index')
-         138±1μs          126±1μs     0.91  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 5)
-      70.6±0.7μs       64.4±0.6μs     0.91  timeseries.SortIndex.time_sort_index(True)
-      93.1±0.4ms       84.9±0.4ms     0.91  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'direct', 1)
-     15.7±0.07ms      14.3±0.05ms     0.91  join_merge.MergeAsof.time_on_int32('backward', 5)
-      36.2±0.3ms       33.0±0.1ms     0.91  rolling.GroupbyLargeGroups.time_rolling_multiindex_creation
-      29.1±0.5ms       26.6±0.2ms     0.91  io.sql.SQL.time_read_sql_query('sqlite')
-     13.5±0.02ms      12.3±0.09ms     0.91  join_merge.MergeAsof.time_on_int('backward', None)
-     14.2±0.04ms      12.9±0.09ms     0.91  join_merge.MergeAsof.time_on_uint64('forward', None)
-      79.2±0.5μs       72.1±0.3μs     0.91  series_methods.ToFrame.time_to_frame('datetime64[ns]', None)
-     15.3±0.09ms      13.9±0.03ms     0.91  join_merge.MergeAsof.time_on_int32('backward', None)
-        900±80ns         819±40ns     0.91  index_cached_properties.IndexCache.time_is_monotonic('RangeIndex')
-        835±40ns          759±3ns     0.91  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(10000, 12000)
-      21.0±0.1ms      19.0±0.06ms     0.91  reshape.Crosstab.time_crosstab
-      79.2±0.3μs       71.9±0.3μs     0.91  series_methods.ToFrame.time_to_frame('datetime64[ns]', 'foo')
-      4.19±0.2μs       3.80±0.2μs     0.91  index_cached_properties.IndexCache.time_shape('TimedeltaIndex')
-     2.14±0.01ms      1.94±0.01ms     0.91  join_merge.Merge.time_merge_dataframe_integer_key(True)
-         525±4μs          476±5μs     0.91  categoricals.Concat.time_concat_overlapping_index
-     13.5±0.05ms      12.2±0.03ms     0.91  join_merge.MergeAsof.time_on_uint64('backward', 5)
-        88.1±1ms         79.7±3ms     0.90  frame_ctor.FromRecords.time_frame_from_records_generator(None)
-        801±40ns          724±4ns     0.90  tslibs.period.TimePeriodArrToDT64Arr.time_periodarray_to_dt64arr(1, 12000)
-     2.58±0.02ms      2.34±0.03ms     0.90  reshape.ReshapeExtensionDtype.time_unstack_slow('Period[s]')
-      42.0±0.3ms       38.0±0.2ms     0.90  groupby.GroupByMethods.time_dtype_as_field('object', 'unique', 'direct', 1)
-        39.3±1ms      35.5±0.06ms     0.90  stat_ops.FrameOps.time_op('prod', 'Int64', 1)
-      16.3±0.2ms       14.7±0.3ms     0.90  eval.Query.time_query_datetime_index
-         352±1μs          317±2μs     0.90  algos.isin.IsIn.time_isin_mismatched_dtype('object')
-      57.4±0.7ms       51.8±0.1ms     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'unique', 'direct', 1)
-     4.18±0.03ms      3.77±0.02ms     0.90  io.sas.SAS.time_read_sas('xport')
-      15.6±0.3ms       14.0±0.1ms     0.90  eval.Query.time_query_datetime_column
-         757±9μs          681±4μs     0.90  period.Indexing.time_align
-     2.26±0.09ms      2.03±0.07ms     0.90  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'count')
-     13.2±0.05ms      11.9±0.05ms     0.90  join_merge.MergeAsof.time_on_uint64('backward', None)
-        1.83±0ms      1.65±0.01ms     0.90  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'sum')
-        420±30ns          378±4ns     0.90  dtypes.DtypesInvalid.time_pandas_dtype_invalid('array-string')
-         993±2μs          893±7μs     0.90  libs.InferDtype.time_infer_dtype('np-object')
-      39.7±0.2ms       35.6±0.2ms     0.90  groupby.GroupByMethods.time_dtype_as_field('float', 'unique', 'direct', 1)
-        469±20μs          421±5μs     0.90  arithmetic.NumericInferOps.time_add(<class 'numpy.int32'>)
-     3.72±0.02ms      3.33±0.02ms     0.90  index_cached_properties.IndexCache.time_is_unique('IntervalIndex')
-         706±4μs          632±4μs     0.89  frame_ctor.FromDicts.time_dict_of_categoricals
-      1.72±0.1μs      1.54±0.07μs     0.89  index_cached_properties.IndexCache.time_inferred_type('DatetimeIndex')
-     1.91±0.02ms      1.70±0.01ms     0.89  io.csv.ReadCSVParseDates.time_baseline('c')
-         235±2ms          208±1ms     0.89  io.stata.StataMissing.time_write_stata('tw')
-         594±4μs          526±5μs     0.89  join_merge.Append.time_append_mixed
-     1.82±0.02ms         1.61±0ms     0.88  join_merge.Merge.time_merge_dataframe_integer_key(False)
-      43.0±0.6ms       37.9±0.2ms     0.88  groupby.Sample.time_sample
-      9.40±0.5ms      8.28±0.06ms     0.88  arithmetic.FrameWithFrameWide.time_op_same_blocks(<built-in function add>, (1000000, 10))
-      50.9±0.2ms       44.8±0.5ms     0.88  groupby.Apply.time_scalar_function_multi_col(4)
-         228±2ms          201±1ms     0.88  io.stata.StataMissing.time_write_stata('th')
-         230±6ms          203±1ms     0.88  io.stata.StataMissing.time_write_stata('tq')
-         218±3ms          192±4ms     0.88  io.stata.StataMissing.time_write_stata('td')
-      17.8±0.1ms       15.6±0.1ms     0.88  groupby.Apply.time_scalar_function_single_col(4)
-     3.44±0.02ms      3.01±0.02ms     0.87  index_cached_properties.IndexCache.time_is_unique('UInt64Index')
-     3.44±0.02ms      3.01±0.02ms     0.87  index_cached_properties.IndexCache.time_is_unique('PeriodIndex')
-     4.73±0.09ms      4.13±0.07ms     0.87  frame_methods.Apply.time_apply_pass_thru
-      3.70±0.2μs       3.22±0.2μs     0.87  index_cached_properties.IndexCache.time_inferred_type('TimedeltaIndex')
-      37.5±0.1μs       32.5±0.4μs     0.87  frame_ctor.FromSeries.time_mi_series
-         216±6ms          187±2ms     0.87  io.stata.StataMissing.time_write_stata('tc')
-         281±4ms        241±0.9ms     0.86  groupby.MultiColumn.time_lambda_sum
-      24.5±0.3ms       20.9±0.1ms     0.86  reshape.Unstack.time_full_product('category')
-         150±2ms          127±1ms     0.85  groupby.MultiColumn.time_col_select_lambda_sum
-         390±3μs          326±3μs     0.84  timeseries.ResetIndex.time_reset_datetimeindex(None)
-         395±2μs          329±3μs     0.83  timeseries.ResetIndex.time_reset_datetimeindex('US/Eastern')
-     9.26±0.09ms       7.65±0.7ms     0.83  rolling.VariableWindowMethods.time_method('DataFrame', '1d', 'float', 'sem')
-      86.5±0.5ms       71.2±0.3ms     0.82  join_merge.Concat.time_concat_series(1)
-         818±2ms         672±10ms     0.82  join_merge.I8Merge.time_i8merge('inner')
-      9.26±0.1ms       7.60±0.7ms     0.82  rolling.VariableWindowMethods.time_method('DataFrame', '50s', 'float', 'sem')
-         929±8ms          761±4ms     0.82  join_merge.I8Merge.time_i8merge('right')
-         819±1ms          671±8ms     0.82  join_merge.I8Merge.time_i8merge('outer')
-     22.4±0.09μs       18.3±0.1μs     0.82  frame_ctor.FromNDArray.time_frame_from_ndarray
-     19.5±0.07ms      15.8±0.03ms     0.81  strings.Cat.time_cat(0, ',', None, 0.15)
-         460±1μs        371±0.9μs     0.81  frame_methods.Shift.time_shift(1)
-         854±9ms          684±8ms     0.80  join_merge.I8Merge.time_i8merge('left')
-     6.90±0.05ms       5.51±0.6ms     0.80  rolling.Methods.time_method('DataFrame', ('expanding', {}), 'float', 'sem')
-     5.95±0.05ms      4.70±0.03ms     0.79  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'Float64')
-     7.40±0.05ms      5.84±0.03ms     0.79  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'float64')
-     6.52±0.04ms      5.10±0.04ms     0.78  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'Int64')
-     5.90±0.03ms      4.59±0.02ms     0.78  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'Int64')
-     6.64±0.03ms      5.14±0.04ms     0.77  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'Float64')
-        16.4±2ms      12.7±0.07ms     0.77  eval.Eval.time_mult('python', 'all')
-     5.99±0.07ms      4.60±0.05ms     0.77  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'Float64')
-     2.86±0.01ms      2.20±0.02ms     0.77  reshape.Melt.time_melt_dataframe
-     6.00±0.04ms      4.60±0.06ms     0.77  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'Int64')
-     9.56±0.08ms      7.24±0.04ms     0.76  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'datetime64[ns, tz]')
-     7.22±0.08ms      5.46±0.03ms     0.76  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'float32')
-      5.84±0.2ms       4.38±0.3ms     0.75  frame_methods.NSort.time_nlargest_one_column('all')
-      3.47±0.1ms      2.58±0.01ms     0.75  frame_ctor.FromArrays.time_frame_from_arrays_float
-      5.18±0.2ms       3.87±0.2ms     0.75  frame_methods.NSort.time_nlargest_one_column('last')
-      5.88±0.2ms       4.36±0.3ms     0.74  frame_methods.NSort.time_nlargest_one_column('first')
-     8.19±0.05ms       5.92±0.1ms     0.72  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'datetime64[ns, tz]')
-     7.87±0.08ms      5.68±0.04ms     0.72  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'datetime64[ns, tz]')
-        17.5±3ms      12.6±0.08ms     0.72  eval.Eval.time_add('python', 'all')
-      7.42±0.1ms      5.26±0.01ms     0.71  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'float64')
-     4.36±0.03ms      2.99±0.01ms     0.69  frame_ctor.FromArrays.time_frame_from_arrays_int
-     4.47±0.01ms      3.04±0.01ms     0.68  frame_ctor.FromArrays.time_frame_from_arrays_sparse
-     7.14±0.08ms      4.79±0.02ms     0.67  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'float32')
-     4.58±0.01ms      3.04±0.02ms     0.66  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'Float64')
-     4.59±0.01ms      3.04±0.02ms     0.66  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'Int64')
-         632±5ms          401±1ms     0.64  frame_methods.Nunique.time_frame_nunique
-      27.4±0.4ms      17.1±0.09ms     0.62  indexing.InsertColumns.time_insert_middle
-     17.1±0.07ms       10.5±0.1ms     0.62  indexing.InsertColumns.time_insert
-         309±3ms          180±2ms     0.58  frame_methods.Fillna.time_frame_fillna(False, 'pad', 'object')
-         314±2ms          180±1ms     0.57  frame_methods.Fillna.time_frame_fillna(False, 'bfill', 'object')
-       158±0.9ms       90.4±0.7ms     0.57  groupby.Apply.time_copy_overhead_single_col(4)
-         409±2ms        230±0.9ms     0.56  groupby.Apply.time_copy_function_multi_col(4)
-     17.0±0.07ms      9.28±0.04ms     0.55  indexing.InsertColumns.time_assign_list_like_with_setitem
-      17.6±0.1ms      9.38±0.02ms     0.53  indexing.InsertColumns.time_assign_with_setitem
-         516±4μs        259±0.8μs     0.50  reindex.Reindex.time_reindex_columns
-         169±3μs         76.8±2μs     0.45  indexing.AssignTimeseriesIndex.time_frame_assign_timeseries_index
-         525±4ms          238±2ms     0.45  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'object')
-     30.4±0.06ms       13.3±0.1ms     0.44  frame_methods.Reindex.time_reindex_axis1
-         526±8ms          226±1ms     0.43  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'object')
-      51.1±0.2ms      20.2±0.05ms     0.40  frame_methods.Rename.time_rename_both_axes
-      51.1±0.1ms       20.1±0.2ms     0.39  frame_methods.Rename.time_dict_rename_both_axes
-      49.3±0.1ms      18.3±0.07ms     0.37  frame_methods.Rename.time_rename_axis0
-      47.1±0.3ms       16.4±0.2ms     0.35  frame_methods.Rename.time_rename_single
-      81.0±0.5μs       28.2±0.4μs     0.35  period.DataFramePeriodColumn.time_setitem_period_column
-      44.8±0.2ms      14.2±0.05ms     0.32  frame_methods.Rename.time_rename_axis1
-         111±2ms      23.4±0.06ms     0.21  reshape.Unstack.time_without_last_row('category')
-     42.2±0.07ms      3.40±0.03ms     0.08  arithmetic.IntFrameWithScalar.time_frame_op_with_scalar(<class 'numpy.float64'>, 2, <built-in function pow>)

SOME BENCHMARKS HAVE CHANGED SIGNIFICANTLY.
PERFORMANCE DECREASED.

@jbrockmendel
Copy link
Member

Thanks for putting this together @jorisvandenbossche. The discussion seemed quite fair to me, and the only real points of disagreement are entirely subjective (e.g. "X is acceptable IMO").

A few other places where I've found ArrayManager performs exceptionally well (in ways that I don't think that BlockManager can meaningfully optimize):

  • DataFrame.insert
  • DataFrame._from_arrays
  • DataFrame(a_dict_that_can_consolidate)

Assorted Notes:

  • IntFrameWithScalar.time_frame_op_with_scalar
    • I tend to get more extreme results for this on my linux desktop than on my mac laptop. Don't know what to make of this.
  • groupby.Apply.time_copy_function_multi_col(4) and groupby.Apply.time_copy_overhead_single_col(4) are each a little less than 2x faster for AM than BM locally. My tentative analysis of this is that it is discarding alignment information (all_indexes_same) that can improve perf (likely for both AM and BM, but mainly BM). xref Dask shuffle performance help #43155 (comment)
  • Many of the places where AM performs well are due to contiguity. I'm experimenting with
    - a) making DataFrame.copy preserve contiguity (so far seems to make a big improvement in frame_methods.Rename but a slowdown in arithmetic.FrameWithFrameWide.time_op_different_blocks) and
    - b) making consolidation retain F-contiguity (so far seems like ive implemented it wrong)

@corleyma
Copy link

corleyma commented Apr 6, 2023

@jorisvandenbossche @jbrockmendel This might be a weird place to ask about this, but given the various roadmap/design docs that mentioned the BlockManager refactor as part of the goals for pandas 2.0, and the wide release of pandas 2.0, is there any one place with a summary of where the project is at with respect to the original goals of moving to a 1d block manager?

I am wondering what folks can expect if using Arrow-backed dtypes in pandas 2.0 as it relates to block manager behavior; the changelog for pandas 2.0 is very large and detailed but I couldn't quite find anything that spelled this out at the high level. E.g., I am curious to know the set of operations that are copy-free (no consolidation) when using pandas 2.0 with Arrow-backed dtypes.

@jbrockmendel
Copy link
Member

Unless you actively opt in to ArrayManager usage (which hasn't seen much discussion in the last year and change), you won't be affected.

E.g., I am curious to know the set of operations that are copy-free (no consolidation)

automatic consolidation has been removed, so you won't be getting any copies on that front. For more copy-free-ness, I suggest trying out pd.set_option("mode.copy_on_write", True)

@rhshadrach
Copy link
Member

The ArrayManager is now deprecated. Closing.

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Internals Related to non-user accessible pandas implementation Refactor Internal refactoring of code
Projects
None yet
Development

No branches or pull requests

5 participants