Skip to content

API: avoid silent consolidation #49456

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

Merged
merged 7 commits into from
Nov 22, 2022

Conversation

jbrockmendel
Copy link
Member

  • closes #xxxx (Replace xxxx with the GitHub issue number)
  • Tests added and passed if fixing a bug or adding a new feature
  • All code checks passed.
  • Added type annotations to new arguments/methods/functions.
  • Added an entry in the latest doc/source/whatsnew/vX.X.X.rst file if fixing a bug or adding a new feature.

@@ -6812,8 +6807,6 @@ def fillna(
inplace = validate_bool_kwarg(inplace, "inplace")
value, method = validate_fillna_kwargs(value, method)

self._consolidate_inplace()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it was more performant to consolidate a fragmented frame before fillna or replace?

Nonetheless, I agree with the notion of "avoiding side effects" when calling a method

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any performance differences in the methods where consolidation no longer happens?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think the main one is going to be in DataFrame.values where subsequent calls could be faster in the status quo if it can be fully consolidated.

@mroeschke mroeschke added the Internals Related to non-user accessible pandas implementation label Nov 1, 2022
Copy link
Member

@mroeschke mroeschke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks fairly good. Could you post some before/after timings of a fragmented frame calling reindex, fillna, and replace?

@jbrockmendel
Copy link
Member Author

We take a pretty big hit in replace, smaller hit in _take and reindex(index=...), and improve in values and reindex(columns=...)

import pandas as pd
df = pd.DataFrame({i: range(100) for i in range(100)}, copy=False)

%timeit obj = df.copy(deep=False); res = obj.replace(4, 5)
855 µs ± 18.3 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- main
4.39 ms ± 25.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)   # <- PR

%timeit obj = df.copy(deep=False); res = obj._take([0, 1])
797 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- main
1.99 ms ± 60.8 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each) # <- PR

%timeit obj = df.copy(deep=False); res = obj.values
711 µs ± 12 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)    # <- main
334 µs ± 3.56 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- PR

%timeit obj = df.copy(deep=False); res = obj.reindex(columns=obj.columns[:5])
861 µs ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- main
414 µs ± 17.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- PR

%timeit obj = df.copy(deep=False); res = obj.reindex(index=obj.index[:5])
819 µs ± 5.02 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- main
2.11 ms ± 100 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- PR

@mroeschke
Copy link
Member

@jreback thoughts on the above performance impact of not silently consolidating?

@jreback
Copy link
Contributor

jreback commented Nov 19, 2022

@jbrockmendel can u run the above again with a much larger number of rows to see how this amortizes

@jbrockmendel
Copy link
Member Author

With a million rows this is faster across the board:

import pandas as pd
df = pd.DataFrame({i: range(10**6) for i in range(100)}, copy=False)

%timeit obj = df.copy(deep=False); res = obj.replace(4, 5)
1.49 s ± 32.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- main
506 ms ± 13.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- PR

%timeit obj = df.copy(deep=False); res = obj._take([0, 1])
895 ms ± 26.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- main
1.91 ms ± 30.1 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)  # <- PR

%timeit obj = df.copy(deep=False); res = obj.values
844 ms ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- main
434 ms ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- PR

%timeit obj = df.copy(deep=False); res = obj.reindex(columns=obj.columns[:5])
845 ms ± 17.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- main
19.6 ms ± 210 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit obj = df.copy(deep=False); res = obj.reindex(index=obj.index[:5])
877 ms ± 21.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  # <- main
2.01 ms ± 27.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  # <- PR

@jreback
Copy link
Contributor

jreback commented Nov 19, 2022

+1 then

i suppose should run a full asv just to see where it is slower (likely a concat or similar)

@jbrockmendel
Copy link
Member Author

I don't for the life of me understand how many of these benchmarks are affected...

       before           after         ratio
     [606499dd]       [d22e4b41]
+         456±9μs       2.81±0.2ms     6.15  groupby.Categories.time_groupby_ordered_sort
+        457±10μs      2.72±0.02ms     5.95  groupby.Categories.time_groupby_sort
+        465±40μs      2.73±0.04ms     5.87  groupby.Categories.time_groupby_extra_cat_sort
+      9.75±0.1μs       32.6±0.2μs     3.34  ctors.SeriesDtypesConstructors.time_dtindex_from_index_with_series
+      7.57±0.1ms         17.1±1ms     2.26  groupby.Nth.time_series_nth_all('float64')
+      7.67±0.3ms       16.4±0.4ms     2.13  groupby.Nth.time_series_nth_all('float32')
+      24.6±0.2μs         52.0±1μs     2.11  categoricals.IsMonotonic.time_categorical_series_is_monotonic_increasing
+      7.76±0.3ms       16.2±0.9ms     2.09  groupby.Nth.time_series_nth_all('datetime')
+      7.66±0.2ms       16.0±0.4ms     2.08  groupby.Nth.time_series_nth_any('float64')
+      9.29±0.1ms       19.2±0.5ms     2.07  ≈.time_frame_nth_any('datetime')
+      8.04±0.2ms       16.5±0.6ms     2.06  groupby.Nth.time_series_nth_any('datetime')
+      7.76±0.1ms       15.9±0.4ms     2.05  groupby.Nth.time_series_nth_any('float32')
+      9.31±0.3ms       18.8±0.7ms     2.02  groupby.Nth.time_frame_nth_any('float64')
+      25.3±0.7μs       51.0±0.8μs     2.02  categoricals.IsMonotonic.time_categorical_series_is_monotonic_decreasing
+      9.68±0.3ms       19.2±0.2ms     1.99  groupby.Nth.time_frame_nth_any('float32')
+      10.6±0.1ms         20.5±1ms     1.93  groupby.Nth.time_series_nth_any('object')
+      10.9±0.2ms       20.6±0.6ms     1.89  groupby.Nth.time_series_nth_all('object')
+      7.81±0.3ms       14.6±0.5ms     1.87  groupby.Nth.time_groupby_nth_all('datetime')
+      8.22±0.1ms       15.1±0.5ms     1.84  groupby.Nth.time_groupby_nth_all('float32')
+     2.41±0.06ms      4.41±0.09ms     1.83  groupby.Categories.time_groupby_extra_cat_nosort
+      8.79±0.1ms       15.0±0.3ms     1.70  groupby.Nth.time_groupby_nth_all('float64')
+     2.97±0.04ms       4.80±0.1ms     1.62  groupby.Categories.time_groupby_nosort
+      3.06±0.1ms      4.58±0.03ms     1.50  groupby.Categories.time_groupby_ordered_nosort
+      18.2±0.2ms         26.1±1ms     1.43  groupby.Nth.time_groupby_nth_all('object')
+        71.2±1μs        98.3±10μs     1.38  groupby.GroupByMethods.time_dtype_as_field('int16', 'all', 'direct', 5)
+         258±6μs          353±2μs     1.37  frame_methods.Quantile.time_frame_quantile(0)
+       126±0.7μs         172±30μs     1.37  groupby.GroupByMethods.time_dtype_as_field('uint', 'first', 'direct', 5)
+        286±10μs         384±20μs     1.34  categoricals.Constructor.time_interval
+      14.6±0.3ms       19.5±0.4ms     1.34  inference.ToDatetimeFormat.time_different_offset
+         101±1μs         136±20μs     1.34  groupby.GroupByMethods.time_dtype_as_field('float', 'min', 'direct', 1)
+         108±3μs         145±20μs     1.33  groupby.GroupByMethods.time_dtype_as_field('int', 'sum', 'direct', 1)
+      68.2±0.5μs        90.9±10μs     1.33  groupby.GroupByMethods.time_dtype_as_field('datetime', 'count', 'direct', 5)
+        88.8±1μs          118±2μs     1.33  groupby.GroupByMethods.time_dtype_as_field('datetime', 'any', 'direct', 1)
+         480±4μs         633±70μs     1.32  timeseries.DatetimeIndex.time_unique('repeated')
+        61.0±1μs         80.2±9μs     1.31  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct', 1)
+       925±200μs      1.21±0.02ms     1.31  categoricals.Constructor.time_datetimes_with_nat
+      86.2±0.5μs          113±1μs     1.31  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct', 5)
+        79.0±1μs         103±20μs     1.30  groupby.GroupByMethods.time_dtype_as_group('int16', 'cumprod', 'direct', 1)
+      65.5±0.9μs        85.1±10μs     1.30  groupby.GroupByMethods.time_dtype_as_field('uint', 'count', 'direct', 5)
+         108±2μs         140±20μs     1.30  groupby.GroupByMethods.time_dtype_as_field('int', 'prod', 'direct', 1)
+        98.7±3μs         128±20μs     1.29  groupby.GroupByMethods.time_dtype_as_field('float', 'sum', 'direct', 1)
+      85.1±0.4μs         110±20μs     1.29  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct', 1)
+        62.1±3μs         80.2±6μs     1.29  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'direct', 1)
+         102±2μs         132±20μs     1.29  groupby.GroupByMethods.time_dtype_as_field('datetime', 'any', 'direct', 5)
+         120±3μs         155±20μs     1.29  groupby.GroupByMethods.time_dtype_as_field('datetime', 'min', 'direct', 1)
+      16.6±0.3ms       21.4±0.8ms     1.29  categoricals.Constructor.time_regular
+         165±3μs         212±30μs     1.28  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cumcount', 'direct', 5)
+     4.02±0.06ms         5.14±1ms     1.28  timeseries.AsOf.time_asof('DataFrame')
+        62.0±2μs        78.9±10μs     1.27  groupby.GroupByMethods.time_dtype_as_field('int16', 'all', 'direct', 1)
+       109±0.5μs         138±20μs     1.27  groupby.GroupByMethods.time_dtype_as_field('int', 'tail', 'direct', 5)
+      46.3±0.4μs         58.4±2μs     1.26  series_methods.ToFrame.time_to_frame('category', 'foo')
+      77.8±0.8μs        98.0±10μs     1.26  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumsum', 'direct', 5)
+        61.5±2ms         77.2±6ms     1.26  io.parsers.DoesStringLookLikeDatetime.time_check_datetimes('10000')
+        98.4±2μs         123±20μs     1.25  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cummin', 'direct', 1)
+         314±6μs         393±50μs     1.25  groupby.GroupByMethods.time_dtype_as_field('int', 'sem', 'direct', 1)
+         125±3μs         156±20μs     1.25  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'direct', 1)
+         114±3μs          142±7μs     1.25  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'direct', 1)
+         372±6μs         464±20μs     1.25  groupby.Datelike.time_sum('date_range_tz')
+        38.4±1ms       47.8±0.7ms     1.24  categoricals.Constructor.time_all_nan
+         117±1μs          146±5μs     1.24  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 5)
+         107±3μs         133±20μs     1.24  groupby.GroupByMethods.time_dtype_as_field('int', 'tail', 'direct', 1)
+         112±2μs         138±20μs     1.24  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 5)
+      13.7±0.3ms       17.0±0.2ms     1.23  algorithms.Factorize.time_factorize(False, True, 'datetime64[ns, tz]')
+         159±1μs          195±8μs     1.23  inference.ToDatetimeCacheSmallCount.time_unique_date_strings(False, 50)
+        65.2±1μs         80.4±2μs     1.23  groupby.GroupByMethods.time_dtype_as_field('int', 'std', 'direct', 1)
+        67.4±1μs         83.0±2μs     1.23  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'direct', 1)
+      74.7±0.9μs         91.9±3μs     1.23  groupby.GroupByMethods.time_dtype_as_field('uint', 'std', 'direct', 5)
+      46.3±0.7μs       56.9±0.8μs     1.23  series_methods.ToFrame.time_to_frame('int64', 'foo')
+      63.0±0.9μs       77.4±0.9μs     1.23  groupby.GroupByMethods.time_dtype_as_field('float', 'std', 'direct', 1)
+         102±2μs          125±8μs     1.23  groupby.GroupByMethods.time_dtype_as_field('float', 'mean', 'direct', 5)
+      46.9±0.7μs         57.5±2μs     1.23  series_methods.ToFrame.time_to_frame('Int64', 'foo')
+      6.86±0.1ms       8.40±0.2ms     1.22  groupby.Nth.time_frame_nth('object')
+         587±4μs         719±20μs     1.22  algorithms.Quantile.time_quantile(0, 'nearest', 'int')
+        82.9±3μs         101±10μs     1.22  groupby.GroupByMethods.time_dtype_as_field('int16', 'shift', 'direct', 5)
+         570±8μs         697±80μs     1.22  timedelta.TimedeltaIndexing.time_align
+      7.01±0.2ms       8.58±0.5ms     1.22  groupby.Nth.time_frame_nth('float32')
+       111±0.9μs          136±9μs     1.22  groupby.GroupByMethods.time_dtype_as_field('float', 'last', 'direct', 5)
+        79.1±1μs        96.7±10μs     1.22  groupby.GroupByMethods.time_dtype_as_field('uint', 'cummin', 'direct', 1)
+      56.0±0.2ms        68.3±10ms     1.22  io.parsers.DoesStringLookLikeDatetime.time_check_datetimes('2Q2005')
+         275±3μs         336±40μs     1.22  groupby.GroupByMethods.time_dtype_as_field('datetime', 'quantile', 'direct', 5)
+      16.9±0.2ms         20.6±1ms     1.22  timeseries.DatetimeAccessor.time_dt_accessor_date(None)
+         101±1μs         124±10μs     1.22  groupby.GroupByMethods.time_dtype_as_field('float', 'max', 'direct', 1)
+      70.6±0.7μs         86.1±3μs     1.22  groupby.GroupByMethods.time_dtype_as_field('uint', 'all', 'direct', 5)
+      16.9±0.1ms         20.6±1ms     1.22  timeseries.DatetimeAccessor.time_dt_accessor_date('UTC')
+        64.1±1μs       78.2±0.8μs     1.22  groupby.GroupByMethods.time_dtype_as_field('uint', 'std', 'direct', 1)
+         160±1μs          195±8μs     1.22  inference.ToDatetimeCacheSmallCount.time_unique_date_strings(True, 50)
+        68.0±1μs         82.8±2μs     1.22  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'direct', 1)
+        47.5±1μs       57.8±0.8μs     1.22  series_methods.ToFrame.time_to_frame('datetime64[ns]', 'foo')
+         115±4μs          140±9μs     1.22  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'direct', 1)
+         106±8μs          128±6μs     1.21  categoricals.Constructor.time_from_codes_all_int8
+      2.89±0.1ms       3.50±0.1ms     1.21  algorithms.Factorize.time_factorize(False, True, 'boolean')
+      23.0±0.5ms         27.9±1ms     1.21  frame_ctor.FromDicts.time_list_of_dict
+     1.82±0.01ms       2.20±0.2ms     1.21  strings.Methods.time_replace('string[pyarrow]')
+         126±5μs          153±4μs     1.21  groupby.GroupByMethods.time_dtype_as_field('float', 'median', 'direct', 5)
+        958±10μs       1.16±0.1ms     1.21  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'transformation', 5)
+        61.4±1μs         74.2±2μs     1.21  groupby.GroupByMethods.time_dtype_as_group('int16', 'all', 'direct', 1)
+     2.65±0.04ms      3.19±0.03ms     1.21  multiindex_object.Isin.time_isin('datetime')
+        67.8±1μs         81.8±2μs     1.21  groupby.GroupByMethods.time_dtype_as_group('int16', 'std', 'direct', 1)
+      57.2±0.9μs         69.1±4μs     1.21  groupby.GroupByMethods.time_dtype_as_field('datetime', 'count', 'direct', 1)
+      69.3±0.5μs         83.6±2μs     1.21  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'direct', 1)
+         122±2μs          148±3μs     1.21  groupby.GroupByMethods.time_dtype_as_group('uint', 'std', 'direct', 5)
+      14.2±0.2ms         17.1±1ms     1.21  strings.Methods.time_islower('str')
+      80.0±0.5μs        96.5±10μs     1.21  groupby.GroupByMethods.time_dtype_as_field('uint', 'cummax', 'direct', 1)
+      67.2±0.5μs         81.0±5μs     1.21  groupby.GroupByMethods.time_dtype_as_field('uint', 'head', 'direct', 5)
+         362±4μs         435±50μs     1.20  groupby.GroupByMethods.time_dtype_as_field('int16', 'sem', 'direct', 5)
+         121±2μs          146±8μs     1.20  groupby.GroupByMethods.time_dtype_as_field('float', 'min', 'direct', 5)
+      22.8±0.4ms       27.4±0.4ms     1.20  frame_ctor.FromDicts.time_nested_dict_index
+         113±2μs          136±3μs     1.20  groupby.GroupByMethods.time_dtype_as_field('int', 'mean', 'direct', 5)
+      5.65±0.2ms       6.80±0.3ms     1.20  groupby.Nth.time_series_nth('float32')
+        74.5±2μs         89.6±5μs     1.20  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 5)
+      77.0±0.5μs        92.5±10μs     1.20  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumprod', 'direct', 1)
+      19.8±0.1ms         23.7±1ms     1.20  timeseries.DatetimeAccessor.time_dt_accessor_date('US/Eastern')
+         173±3μs         208±50μs     1.20  groupby.GroupByMethods.time_dtype_as_field('uint', 'ffill', 'direct', 1)
+      16.8±0.2ms       20.2±0.6ms     1.20  algos.isin.IsinAlmostFullWithRandomInt.time_isin(<class 'numpy.int64'>, 20, 'outside')
+      16.9±0.2ms         20.2±2ms     1.20  timeseries.DatetimeAccessor.time_dt_accessor_date(tzutc())
+         134±4μs         160±30μs     1.20  groupby.GroupByMethods.time_dtype_as_field('datetime', 'first', 'direct', 5)
+         109±1μs          131±8μs     1.20  groupby.GroupByMethods.time_dtype_as_field('object', 'tail', 'direct', 1)
+         128±2μs         153±20μs     1.20  groupby.GroupByMethods.time_dtype_as_field('int16', 'first', 'direct', 5)
+         118±2μs          141±7μs     1.20  groupby.GroupByMethods.time_dtype_as_field('float', 'max', 'direct', 5)
+     3.41±0.03ms       4.08±0.6ms     1.20  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '.', 'round_trip')
+         461±9μs         551±60μs     1.19  groupby.GroupByMethods.time_dtype_as_field('uint', 'count', 'transformation', 1)
+         112±2μs         133±10μs     1.19  groupby.GroupByMethods.time_dtype_as_field('uint', 'first', 'direct', 1)
+        83.2±3μs        99.3±10μs     1.19  groupby.GroupByMethods.time_dtype_as_field('int', 'shift', 'direct', 5)
+      61.0±0.6μs         72.8±5μs     1.19  groupby.GroupByMethods.time_dtype_as_field('uint', 'any', 'direct', 1)
+         126±1μs          150±2μs     1.19  groupby.GroupByMethods.time_dtype_as_group('float', 'std', 'direct', 5)
+         529±8μs         631±60μs     1.19  groupby.GroupByMethods.time_dtype_as_field('int', 'prod', 'transformation', 1)
+       124±0.8μs          148±2μs     1.19  groupby.GroupByMethods.time_dtype_as_group('int16', 'std', 'direct', 5)
+      16.9±0.1ms         20.2±1ms     1.19  groupby.GroupByMethods.time_dtype_as_field('uint', 'describe', 'direct', 1)
+      62.0±0.7μs       73.7±0.7μs     1.19  groupby.GroupByMethods.time_dtype_as_field('float', 'all', 'direct', 1)
+        581±20μs         691±20μs     1.19  algorithms.Quantile.time_quantile(0, 'nearest', 'uint')
+        694±20μs         825±10μs     1.19  algorithms.Quantile.time_quantile(1, 'nearest', 'uint')
+         139±6μs         165±10μs     1.19  groupby.GroupByMethods.time_dtype_as_field('uint', 'min', 'direct', 5)
+        581±30μs         689±20μs     1.19  algorithms.Quantile.time_quantile(0, 'higher', 'uint')
+        61.6±1μs       73.1±0.9μs     1.19  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct', 1)
+         129±2μs         153±10μs     1.19  groupby.GroupByMethods.time_dtype_as_field('datetime', 'last', 'direct', 5)
+         101±1μs          120±6μs     1.19  groupby.GroupByMethods.time_dtype_as_field('datetime', 'all', 'direct', 5)
+        718±10μs         851±30μs     1.19  algorithms.Quantile.time_quantile(0.5, 'lower', 'int')
+        93.6±2μs          111±4μs     1.19  groupby.GroupByMethods.time_dtype_as_field('float', 'last', 'direct', 1)
+      23.3±0.4ms       27.6±0.4ms     1.19  frame_ctor.FromDicts.time_nested_dict_index_columns
+         312±6μs          370±9μs     1.19  groupby.GroupByMethods.time_dtype_as_field('int16', 'sem', 'direct', 1)
+      70.0±0.8μs         83.0±1μs     1.19  groupby.GroupByMethods.time_dtype_as_group('int16', 'all', 'direct', 5)
+     5.35±0.07ms       6.34±0.4ms     1.19  groupby.Nth.time_series_nth('float64')
+        74.1±3μs         87.8±6μs     1.18  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'direct', 5)
+         561±6μs         664±80μs     1.18  groupby.GroupByMethods.time_dtype_as_field('datetime', 'first', 'transformation', 1)
+         379±4μs         448±40μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int16', 'cummax', 'transformation', 1)
+      91.8±0.8μs          109±5μs     1.18  groupby.GroupByMethods.time_dtype_as_field('float', 'prod', 'direct', 1)
+      72.7±0.6μs         85.9±2μs     1.18  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct', 5)
+         131±3μs         154±20μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int16', 'last', 'direct', 5)
+        707±20μs         835±30μs     1.18  algorithms.Quantile.time_quantile(1, 'lower', 'uint')
+        59.9±1μs         70.7±2μs     1.18  groupby.GroupByMethods.time_dtype_as_field('uint', 'all', 'direct', 1)
+      77.0±0.9μs         90.9±2μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int16', 'std', 'direct', 5)
+      60.9±0.7μs         71.9±1μs     1.18  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct', 1)
+        95.4±2μs          113±7μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int', 'mean', 'direct', 1)
+        63.2±1μs         74.6±5μs     1.18  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'direct', 1)
+     2.51±0.03ms      2.96±0.04ms     1.18  multiindex_object.Isin.time_isin('int')
+      9.59±0.1ms         11.3±1ms     1.18  timeseries.Iteration.time_iter_preexit(<function period_range>)
+         134±4μs          157±9μs     1.18  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'direct', 5)
+         115±2μs         136±20μs     1.18  groupby.GroupByMethods.time_dtype_as_group('int16', 'max', 'direct', 1)
+         299±3μs         352±50μs     1.18  groupby.GroupByMethods.time_dtype_as_field('datetime', 'diff', 'direct', 1)
+      54.1±0.7μs         63.7±3μs     1.18  groupby.GroupByMethods.time_dtype_as_field('uint', 'count', 'direct', 1)
+        424±20μs          499±9μs     1.18  stat_ops.FrameOps.time_op('sum', 'Int64', 0)
+         128±1μs          151±1μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int', 'sum', 'direct', 5)
+         701±7μs         824±90μs     1.18  groupby.GroupByMethods.time_dtype_as_field('int16', 'sem', 'transformation', 1)
+      72.5±0.9μs         85.2±4μs     1.18  groupby.GroupByMethods.time_dtype_as_field('uint', 'any', 'direct', 5)
+        87.5±1μs          103±3μs     1.17  groupby.GroupByMethods.time_dtype_as_field('datetime', 'all', 'direct', 1)
+         108±1μs          126±4μs     1.17  groupby.GroupByMethods.time_dtype_as_group('int16', 'last', 'direct', 1)
+         108±4μs          127±7μs     1.17  groupby.GroupByMethods.time_dtype_as_field('int16', 'last', 'direct', 1)
+         118±3μs          138±9μs     1.17  groupby.GroupByMethods.time_dtype_as_field('uint', 'max', 'direct', 1)
+     1.16±0.03ms      1.36±0.06ms     1.17  io.csv.ReadCSVFloatPrecision.time_read_csv(',', '.', None)
+        99.7±1μs          117±4μs     1.17  groupby.GroupByMethods.time_dtype_as_group('uint', 'count', 'direct', 5)
+        70.5±1μs         82.7±1μs     1.17  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'direct', 5)
+      61.8±0.4μs         72.4±2μs     1.17  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'direct', 1)
+      17.1±0.4ms       20.1±0.2ms     1.17  groupby.GroupByMethods.time_dtype_as_field('int', 'describe', 'direct', 1)
+        89.5±1μs          105±6μs     1.17  groupby.GroupByMethods.time_dtype_as_field('int16', 'cummax', 'direct', 5)
+         112±2μs          132±2μs     1.17  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'direct', 1)
+      72.5±0.5μs         84.9±1μs     1.17  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct', 5)
+      74.4±0.8μs       87.0±0.8μs     1.17  groupby.GroupByMethods.time_dtype_as_field('float', 'std', 'direct', 5)
+      53.5±0.8μs         62.5±2μs     1.17  groupby.GroupByMethods.time_dtype_as_group('int16', 'count', 'direct', 1)
+      73.5±0.5μs         85.8±2μs     1.17  groupby.GroupByMethods.time_dtype_as_group('int16', 'any', 'direct', 5)
+      6.61±0.2ms       7.72±0.2ms     1.17  groupby.Nth.time_frame_nth('float64')
+        64.0±1μs         74.8±2μs     1.17  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'direct', 1)
+        87.5±1μs          102±5μs     1.17  groupby.GroupByMethods.time_dtype_as_field('int', 'var', 'direct', 1)
+     3.46±0.04ms       4.04±0.5ms     1.17  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(',', '.', None)
+        53.8±1μs         62.8±1μs     1.17  groupby.GroupByMethods.time_dtype_as_field('float', 'count', 'direct', 1)
+        93.2±1μs          109±2μs     1.17  groupby.GroupByMethods.time_dtype_as_group('int16', 'cumsum', 'direct', 5)
+      28.7±0.4ms       33.5±0.5ms     1.17  groupby.GroupByMethods.time_dtype_as_group('uint', 'describe', 'direct', 1)
+        380±10μs          444±6μs     1.17  frame_methods.Quantile.time_frame_quantile(1)
+         117±3μs          137±5μs     1.17  groupby.GroupByMethods.time_dtype_as_field('uint', 'min', 'direct', 1)
+        63.0±1μs         73.4±1μs     1.17  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct', 1)
+         109±2μs          128±4μs     1.17  groupby.GroupByMethods.time_dtype_as_field('uint', 'last', 'direct', 1)
+      71.8±0.8μs       83.6±0.9μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct', 5)
+      5.43±0.2ms       6.32±0.5ms     1.16  io.csv.ReadCSVEngine.time_read_bytescsv('pyarrow')
+        65.8±4μs         76.5±1μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int16', 'std', 'direct', 1)
+        72.8±2μs         84.6±2μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'direct', 5)
+         229±4μs         266±20μs     1.16  inference.ToDatetimeCacheSmallCount.time_unique_date_strings(False, 500)
+         102±2μs          119±2μs     1.16  groupby.GroupByMethods.time_dtype_as_field('float', 'tail', 'direct', 1)
+        60.3±1μs         69.9±1μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int16', 'any', 'direct', 1)
+         324±3μs          376±5μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct', 5)
+        61.4±1μs         71.2±1μs     1.16  groupby.GroupByMethods.time_dtype_as_group('uint', 'all', 'direct', 1)
+         118±2μs          137±7μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct', 1)
+        88.3±2μs          102±3μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'direct', 1)
+        52.2±1μs         60.5±1μs     1.16  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct', 1)
+         130±1μs         151±10μs     1.16  groupby.GroupByMethods.time_dtype_as_field('object', 'count', 'direct', 5)
+      6.42±0.3ms       7.44±0.7ms     1.16  io.csv.ReadCSVConcatDatetimeBadDateValue.time_read_csv('0')
+         110±2μs          127±2μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int16', 'sum', 'direct', 1)
+         102±1μs          118±2μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int16', 'tail', 'direct', 1)
+        99.3±1μs          115±2μs     1.16  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct', 1)
+      58.6±0.4μs       67.8±0.7μs     1.16  groupby.GroupByMethods.time_dtype_as_group('object', 'head', 'direct', 1)
+         106±3μs         122±10μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int', 'var', 'direct', 5)
+         237±1μs         274±10μs     1.16  inference.ToDatetimeCacheSmallCount.time_unique_date_strings(True, 500)
+      59.9±0.8μs       69.3±0.9μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int16', 'any', 'direct', 1)
+         294±3μs         339±10μs     1.16  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct', 5)
+         110±1μs          127±3μs     1.16  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'direct', 1)
+        14.8±1ms       17.1±0.5ms     1.16  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummin')
+         136±4μs          158±9μs     1.16  groupby.GroupByMethods.time_dtype_as_field('int', 'first', 'direct', 5)
+        716±20μs         826±20μs     1.15  algorithms.Quantile.time_quantile(0.5, 'higher', 'uint')
+      70.8±0.9μs         81.8±1μs     1.15  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'direct', 5)
+         126±4μs          146±4μs     1.15  groupby.GroupByMethods.time_dtype_as_field('uint', 'last', 'direct', 5)
+         164±1μs          190±6μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int16', 'bfill', 'direct', 1)
+      73.2±0.8μs         84.5±1μs     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct', 5)
+      69.4±0.7μs         80.1±7μs     1.15  groupby.GroupByMethods.time_dtype_as_field('float', 'head', 'direct', 5)
+        79.3±2μs         91.5±3μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int', 'std', 'direct', 5)
+      20.3±0.1ms         23.4±2ms     1.15  strings.Methods.time_normalize('str')
+     1.35±0.02ms      1.56±0.09ms     1.15  io.csv.ReadCSVParseDates.time_multiple_date('c')
+     1.74±0.02ms      2.01±0.03ms     1.15  reshape.SimpleReshape.time_stack
+     1.70±0.03ms       1.95±0.2ms     1.15  timeseries.ResampleSeries.time_resample('datetime', '5min', 'ohlc')
+         430±2μs         496±60μs     1.15  groupby.GroupByMethods.time_dtype_as_field('uint', 'bfill', 'transformation', 1)
+      99.5±0.9μs          115±2μs     1.15  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct', 5)
+      59.9±0.4μs         69.0±2μs     1.15  groupby.GroupByMethods.time_dtype_as_group('object', 'any', 'direct', 1)
+         108±2μs          125±2μs     1.15  groupby.GroupByMethods.time_dtype_as_field('uint', 'tail', 'direct', 5)
+         138±2μs          158±5μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int', 'max', 'direct', 5)
+     2.93±0.03ms       3.37±0.2ms     1.15  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '_', None)
+         116±2μs          133±3μs     1.15  groupby.GroupByMethods.time_dtype_as_group('uint', 'min', 'direct', 1)
+        383±10μs         441±20μs     1.15  groupby.Datelike.time_sum('date_range')
+         111±3μs          128±4μs     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'direct', 1)
+         126±4μs          145±5μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int', 'prod', 'direct', 5)
+         471±9μs         541±10μs     1.15  stat_ops.FrameOps.time_op('prod', 'Int64', 0)
+        950±20μs      1.09±0.07ms     1.15  algorithms.Quantile.time_quantile(1, 'linear', 'int')
+        63.8±2μs       73.3±0.7μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int16', 'count', 'direct', 5)
+      53.8±0.9μs         61.8±1μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int16', 'count', 'direct', 1)
+     2.11±0.01ms      2.43±0.04ms     1.15  algorithms.Factorize.time_factorize(False, False, 'boolean')
+      17.2±0.3ms       19.8±0.2ms     1.15  groupby.GroupByMethods.time_dtype_as_field('float', 'describe', 'direct', 1)
+     2.56±0.04ms       2.95±0.1ms     1.15  io.csv.ParseDateComparison.time_to_datetime_format_DD_MM_YYYY(True)
+      63.7±0.8μs         73.2±1μs     1.15  groupby.GroupByMethods.time_dtype_as_group('datetime', 'head', 'direct', 1)
+         104±3μs          119±7μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int16', 'tail', 'direct', 1)
+        63.7±1μs         73.1±2μs     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'head', 'direct', 1)
+     1.05±0.02ms      1.20±0.04ms     1.15  algorithms.Quantile.time_quantile(0, 'linear', 'uint')
+         114±1μs          131±9μs     1.15  groupby.GroupByMethods.time_dtype_as_group('int16', 'median', 'direct', 1)
+      62.0±0.3μs       71.1±0.8μs     1.15  groupby.GroupByMethods.time_dtype_as_group('int16', 'head', 'direct', 1)
+         125±3μs          143±3μs     1.15  groupby.GroupByMethods.time_dtype_as_group('int', 'std', 'direct', 5)
+        66.8±2μs         76.5±2μs     1.15  groupby.GroupByMethods.time_dtype_as_field('int', 'count', 'direct', 5)
+         116±1μs          133±2μs     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'direct', 1)
+      29.9±0.6ms       34.3±0.3ms     1.15  frame_ctor.FromDicts.time_nested_dict
+         114±2μs          130±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'direct', 1)
+        720±20μs         825±30μs     1.14  algorithms.Quantile.time_quantile(1, 'higher', 'int')
+      54.1±0.3μs         62.0±1μs     1.14  groupby.GroupByMethods.time_dtype_as_field('int', 'count', 'direct', 1)
+        16.3±1ms       18.6±0.6ms     1.14  groupby.Cumulative.time_frame_transform_many_nulls('Float64', 'cummax')
+         356±4μs         408±10μs     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'sum', 'direct', 5)
+        75.4±1μs         86.3±7μs     1.14  groupby.GroupByMethods.time_dtype_as_field('int', 'cumsum', 'direct', 1)
+         135±3μs          155±4μs     1.14  groupby.GroupByMethods.time_dtype_as_field('uint', 'median', 'direct', 5)
+        98.8±1μs          113±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('object', 'tail', 'direct', 1)
+         114±1μs          130±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct', 1)
+        93.5±2μs          107±1μs     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumsum', 'direct', 5)
+     3.41±0.04ms       3.90±0.5ms     1.14  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(',', '.', 'high')
+      17.0±0.5ms       19.5±0.4ms     1.14  groupby.GroupByMethods.time_dtype_as_field('int16', 'describe', 'direct', 1)
+        23.9±1ms       27.4±0.7ms     1.14  groupby.GroupByCythonAgg.time_frame_agg('float64', 'sum')
+      30.7±0.3ms       35.1±0.5ms     1.14  frame_ctor.FromDicts.time_nested_dict_columns
+        72.0±1μs         82.2±1μs     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'all', 'direct', 5)
+      71.0±0.8μs         81.1±8μs     1.14  groupby.GroupByMethods.time_dtype_as_group('object', 'shift', 'direct', 1)
+         208±2μs         238±10μs     1.14  groupby.GroupByMethods.time_dtype_as_field('datetime', 'bfill', 'direct', 5)
+         341±2μs         389±10μs     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'prod', 'direct', 5)
+         140±5μs          160±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'cumcount', 'direct', 1)
+         115±3μs          131±4μs     1.14  groupby.GroupByMethods.time_dtype_as_group('int', 'max', 'direct', 1)
+      72.7±0.7μs         82.9±2μs     1.14  groupby.GroupByMethods.time_dtype_as_field('float', 'all', 'direct', 5)
+       100±0.8μs          115±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('int16', 'count', 'direct', 5)
+         443±4μs         505±20μs     1.14  stat_ops.FrameOps.time_op('sum', 'float', 0)
+         114±1μs          130±4μs     1.14  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'direct', 1)
+         111±1μs          126±4μs     1.14  groupby.GroupByMethods.time_dtype_as_group('uint', 'last', 'direct', 1)
+         109±2μs          124±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('int16', 'prod', 'direct', 1)
+         112±3μs          128±2μs     1.14  groupby.GroupByMethods.time_dtype_as_field('float', 'sum', 'direct', 5)
+        64.7±1μs         73.7±5μs     1.14  groupby.GroupByMethods.time_dtype_as_field('uint', 'head', 'direct', 1)
+        74.4±1μs         84.6±2μs     1.14  groupby.GroupByMethods.time_dtype_as_field('int', 'all', 'direct', 5)
+     1.74±0.02ms      1.98±0.07ms     1.14  io.csv.ReadCSVDInferDatetimeFormat.time_read_csv(True, 'ymd')
+      96.9±0.7μs          110±2μs     1.14  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct', 5)
+     1.40±0.01ms      1.60±0.09ms     1.14  timeseries.DatetimeIndex.time_timeseries_is_month_start('repeated')
+         117±2μs          133±5μs     1.14  groupby.GroupByMethods.time_dtype_as_group('int16', 'first', 'direct', 1)
+       101±0.9μs          114±4μs     1.14  groupby.GroupByMethods.time_dtype_as_field('uint', 'var', 'direct', 5)
+         139±6μs          158±4μs     1.14  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct', 5)
+     1.09±0.05ms      1.24±0.04ms     1.14  algorithms.Quantile.time_quantile(0, 'midpoint', 'uint')
+        736±10μs         837±20μs     1.14  algorithms.Quantile.time_quantile(0.5, 'nearest', 'int')
+      69.2±0.9μs         78.7±5μs     1.14  groupby.GroupByMethods.time_dtype_as_field('object', 'head', 'direct', 1)
+         108±3μs          123±2μs     1.14  groupby.GroupByMethods.time_dtype_as_field('uint', 'sum', 'direct', 1)
+         101±3μs          115±2μs     1.14  groupby.GroupByMethods.time_dtype_as_field('float', 'first', 'direct', 1)
+         194±2μs         220±20μs     1.14  groupby.GroupByMethods.time_dtype_as_field('datetime', 'bfill', 'direct', 1)
+        93.6±1μs          106±4μs     1.14  groupby.GroupByMethods.time_dtype_as_field('int16', 'mean', 'direct', 1)
+         354±4μs         402±10μs     1.14  groupby.GroupByMethods.time_dtype_as_group('int16', 'sum', 'direct', 5)
+         181±3μs          205±8μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct', 5)
+        602±20μs         683±10μs     1.13  algorithms.Quantile.time_quantile(0, 'lower', 'uint')
+         111±2μs          125±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct', 1)
+     1.24±0.01ms      1.41±0.08ms     1.13  stat_ops.FrameOps.time_op('var', 'float', 0)
+      53.7±0.6μs       60.9±0.6μs     1.13  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct', 1)
+         135±4μs          153±9μs     1.13  groupby.GroupByMethods.time_dtype_as_field('uint', 'max', 'direct', 5)
+         115±2μs          131±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'first', 'direct', 1)
+         105±1μs          119±2μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct', 1)
+         114±1μs          129±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct', 1)
+        80.4±1μs         91.1±9μs     1.13  groupby.GroupByMethods.time_dtype_as_field('int16', 'cummin', 'direct', 1)
+        89.7±1μs          102±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int16', 'var', 'direct', 1)
+         109±3μs          124±2μs     1.13  groupby.GroupByMethods.time_dtype_as_field('int16', 'tail', 'direct', 5)
+         337±3μs          382±6μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'direct', 5)
+         113±1μs          128±4μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'direct', 1)
+        719±20μs         814±30μs     1.13  algorithms.Quantile.time_quantile(0.5, 'lower', 'uint')
+         338±6μs          382±5μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'min', 'direct', 5)
+      38.5±0.5ms         43.6±1ms     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 1)
+        98.7±2μs          112±2μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct', 1)
+         159±1μs          180±6μs     1.13  groupby.GroupByMethods.time_dtype_as_field('int16', 'cumcount', 'direct', 1)
+      44.7±0.6ms         50.4±1ms     1.13  io.csv.ToCSVDatetimeBig.time_frame(10000)
+         335±6μs          378±9μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct', 5)
+         346±4μs          391±6μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'sum', 'direct', 5)
+     1.20±0.02ms      1.36±0.04ms     1.13  io.csv.ReadCSVFloatPrecision.time_read_csv(';', '_', 'round_trip')
+         107±3μs          121±1μs     1.13  groupby.GroupByMethods.time_dtype_as_field('uint', 'prod', 'direct', 1)
+        74.4±1μs       83.9±0.6μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'direct', 5)
+        83.9±1μs         94.6±7μs     1.13  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumprod', 'direct', 5)
+         644±9ms          725±9ms     1.13  join_merge.I8Merge.time_i8merge('left')
+         334±4μs          377±6μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int16', 'first', 'direct', 5)
+         110±3μs          124±2μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'direct', 1)
+      15.4±0.1ms         17.3±1ms     1.13  timeseries.DatetimeAccessor.time_dt_accessor_month_name('UTC')
+         116±4ms          130±2ms     1.13  io.json.ReadJSON.time_read_json('split', 'int')
+        73.4±1μs         82.6±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct', 5)
+        90.5±1μs          102±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'var', 'direct', 1)
+     1.04±0.01ms      1.17±0.04ms     1.13  timeseries.ResampleDataFrame.time_method('max')
+      63.3±0.7μs         71.2±1μs     1.13  groupby.GroupByMethods.time_dtype_as_group('uint', 'head', 'direct', 1)
+         109±4μs          123±2μs     1.13  groupby.GroupByMethods.time_dtype_as_field('float', 'prod', 'direct', 5)
+     1.49±0.02ms       1.67±0.1ms     1.13  io.csv.ReadCSVCachedParseDates.time_read_csv_cached(False, 'c')
+         104±1μs          117±3μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'count', 'direct', 5)
+         101±1μs          113±5μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'size', 'direct', 5)
+        98.7±1μs          111±1μs     1.13  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'direct', 5)
+         119±3μs          134±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'first', 'direct', 1)
+        54.9±1μs         61.8±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'count', 'direct', 1)
+      70.3±0.7μs         79.0±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct', 5)
+         109±2μs          123±8μs     1.12  groupby.GroupByMethods.time_dtype_as_field('float', 'median', 'direct', 1)
+         331±3μs          372±8μs     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'direct', 5)
+      87.2±0.9μs         98.0±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'var', 'direct', 1)
+      23.3±0.4ms         26.2±1ms     1.12  strings.Methods.time_zfill('string[pyarrow]')
+        606±20μs         681±20μs     1.12  algorithms.Quantile.time_quantile(0, 'lower', 'int')
+      75.2±0.6μs         84.5±5μs     1.12  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 5)
+     1.15±0.03ms      1.29±0.06ms     1.12  algorithms.Quantile.time_quantile(0.5, 'midpoint', 'uint')
+         134±2μs          151±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int16', 'max', 'direct', 5)
+     1.74±0.01ms       1.95±0.1ms     1.12  timeseries.DatetimeIndex.time_normalize('tz_naive')
+         154±1μs          173±8μs     1.12  groupby.GroupByMethods.time_dtype_as_field('object', 'last', 'direct', 1)
+         340±9μs         381±20μs     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct', 5)
+      96.8±0.9μs          109±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'cumsum', 'direct', 5)
+        74.0±2μs         83.0±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'any', 'direct', 5)
+     1.17±0.01ms       1.31±0.1ms     1.12  inference.ToDatetimeFromIntsFloats.time_nanosec_uint64
+        722±10μs         810±20μs     1.12  algorithms.Quantile.time_quantile(1, 'higher', 'uint')
+         266±7ms          299±6ms     1.12  io.csv.ToCSVMultiIndexUnusedLevels.time_full_frame
+      85.9±0.9μs         96.4±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'cummin', 'direct', 5)
+         104±3μs          116±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'tail', 'direct', 1)
+      29.3±0.3ms       32.9±0.7ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 1)
+         327±2μs          366±6μs     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'direct', 5)
+         165±2μs          185±4μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumcount', 'direct', 5)
+      25.9±0.6ms       29.1±0.7ms     1.12  io.csv.ToCSVMultiIndexUnusedLevels.time_sliced_frame
+        961±10μs      1.08±0.01ms     1.12  algorithms.Quantile.time_quantile(1, 'midpoint', 'uint')
+        63.6±1μs         71.3±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'head', 'direct', 1)
+         138±4μs          155±4μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'min', 'direct', 5)
+         335±3μs          376±9μs     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'last', 'direct', 5)
+        61.9±1μs       69.4±0.5μs     1.12  groupby.GroupByMethods.time_dtype_as_group('object', 'all', 'direct', 1)
+        98.7±2μs        111±0.9μs     1.12  groupby.GroupByMethods.time_dtype_as_group('int16', 'cumprod', 'direct', 5)
+         182±2μs         204±20μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int16', 'cumprod', 'direct', 1)
+         176±2μs         197±20μs     1.12  groupby.GroupByMethods.time_dtype_as_field('object', 'last', 'direct', 5)
+         338±3μs          378±7μs     1.12  groupby.GroupByMethods.time_dtype_as_group('int16', 'prod', 'direct', 5)
+         118±3μs          132±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'direct', 1)
+     1.17±0.04ms      1.31±0.02ms     1.12  algorithms.Quantile.time_quantile(0.5, 'midpoint', 'int')
+      35.4±0.2ms       39.6±0.6ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'transformation', 5)
+         135±3μs          151±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int16', 'min', 'direct', 5)
+      36.9±0.3ms         41.3±1ms     1.12  groupby.GroupByMethods.time_dtype_as_group('int16', 'skew', 'direct', 5)
+        99.0±2μs          111±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'size', 'direct', 1)
+         333±6μs          373±7μs     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'direct', 5)
+         361±5μs         403±50μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumsum', 'transformation', 1)
+        98.5±1μs          110±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'size', 'direct', 1)
+      6.72±0.1ms       7.51±0.1ms     1.12  groupby.Nth.time_frame_nth('datetime')
+         118±2μs          132±4μs     1.12  groupby.GroupByMethods.time_dtype_as_group('uint', 'max', 'direct', 1)
+        73.2±2μs         81.8±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int16', 'any', 'direct', 5)
+         127±1μs          142±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('uint', 'prod', 'direct', 5)
+      84.8±0.5μs         94.7±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'cummax', 'direct', 5)
+         134±4μs          149±3μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'max', 'direct', 5)
+        70.2±1μs         78.4±2μs     1.12  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'direct', 1)
+        83.3±1μs         93.1±9μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int16', 'cummax', 'direct', 1)
+        88.3±1ms         98.6±3ms     1.12  strings.Methods.time_rpartition('string[pyarrow]')
+         468±4μs         523±60μs     1.12  groupby.GroupByMethods.time_dtype_as_field('datetime', 'count', 'transformation', 1)
+      53.4±0.8ms         59.6±1ms     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'transformation', 5)
+         167±2μs          187±2μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int', 'cumcount', 'direct', 5)
+        54.7±1μs       61.0±0.7μs     1.12  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct', 1)
+         350±4μs          391±3μs     1.12  groupby.GroupByMethods.time_dtype_as_group('float', 'prod', 'direct', 5)
+         116±6μs          130±5μs     1.12  groupby.GroupByMethods.time_dtype_as_field('int', 'first', 'direct', 1)
+      6.17±0.2ms       6.87±0.1ms     1.12  frame_methods.Fillna.time_frame_fillna(True, 'bfill', 'Float64')
+         154±3μs         171±10μs     1.11  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumcount', 'direct', 1)
+         337±4μs          376±4μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int16', 'min', 'direct', 5)
+      94.7±0.7μs          105±1μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int16', 'mean', 'direct', 1)
+     1.10±0.03ms      1.23±0.03ms     1.11  algorithms.Quantile.time_quantile(0, 'midpoint', 'int')
+         331±3μs          369±4μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int16', 'last', 'direct', 5)
+         103±2μs          115±1μs     1.11  groupby.GroupByMethods.time_dtype_as_group('uint', 'tail', 'direct', 1)
+         166±3μs         185±10μs     1.11  groupby.GroupByMethods.time_dtype_as_field('int16', 'ffill', 'direct', 1)
+      41.5±0.3ms         46.2±2ms     1.11  groupby.GroupByCythonAggEaDtypes.time_frame_agg('Float64', 'first')
+         109±2μs          121±2μs     1.11  groupby.GroupByMethods.time_dtype_as_field('int16', 'mean', 'direct', 5)
+         371±6μs         413±20μs     1.11  groupby.GroupByMethods.time_dtype_as_field('uint', 'cummax', 'transformation', 1)
+         336±6μs          374±6μs     1.11  groupby.GroupByMethods.time_dtype_as_group('uint', 'first', 'direct', 5)
+         481±9μs         535±10μs     1.11  period.Indexing.time_align
+        92.9±1μs          103±5μs     1.11  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct', 5)
+      55.0±0.4μs         61.2±7μs     1.11  dtypes.SelectDtypes.time_select_dtype_string_include('int8')
+        56.2±2ms         62.4±3ms     1.11  groupby.GroupByCythonAggEaDtypes.time_frame_agg('Float64', 'var')
+        632±10ms         702±10ms     1.11  join_merge.I8Merge.time_i8merge('inner')
+      37.0±0.4ms       41.0±0.6ms     1.11  groupby.GroupByMethods.time_dtype_as_group('int16', 'skew', 'transformation', 5)
+     2.97±0.02ms      3.30±0.04ms     1.11  stat_ops.Correlation.time_corrwith_rows('pearson')
+         339±4μs          376±1μs     1.11  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'direct', 5)
+         248±1ms          275±3ms     1.11  frame_methods.Fillna.time_frame_fillna(True, 'pad', 'object')
+         362±6μs         401±20μs     1.11  groupby.GroupByMethods.time_dtype_as_field('int', 'sem', 'direct', 5)
+         104±3μs          116±1μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int', 'tail', 'direct', 1)
+     3.88±0.07ms      4.30±0.06ms     1.11  reshape.PivotTable.time_pivot_table_categorical_observed
+         542±9μs         601±80μs     1.11  groupby.GroupByMethods.time_dtype_as_field('object', 'value_counts', 'direct', 1)
+      60.9±0.7ms         67.5±5ms     1.11  io.csv.ReadCSVThousands.time_thousands('|', None, 'python')
+         114±2μs          127±3μs     1.11  groupby.GroupByMethods.time_dtype_as_field('datetime', 'max', 'direct', 1)
+      70.1±0.5μs         77.7±4μs     1.11  groupby.GroupByMethods.time_dtype_as_field('object', 'shift', 'direct', 1)
+         118±2μs          131±2μs     1.11  groupby.GroupByMethods.time_dtype_as_field('float', 'size', 'direct', 5)
+        72.2±1μs         79.9±1μs     1.11  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'direct', 1)
+         189±2ms          209±3ms     1.11  groupby.Transform.time_transform_lambda_max
+      83.4±0.6ms       92.3±0.8ms     1.11  replace.Convert.time_replace('DataFrame', 'Timedelta')
+        632±10ms          700±8ms     1.11  join_merge.I8Merge.time_i8merge('outer')
+      91.9±0.6μs          102±4μs     1.11  groupby.GroupByMethods.time_dtype_as_field('uint', 'mean', 'direct', 1)
+      13.9±0.2ms       15.3±0.6ms     1.11  gil.ParallelFactorize.time_loop(2)
+         363±7μs         401±10μs     1.11  groupby.GroupByMethods.time_dtype_as_field('uint', 'sem', 'direct', 5)
+         117±2μs          129±2μs     1.11  groupby.GroupByMethods.time_dtype_as_group('int16', 'min', 'direct', 1)
+        76.0±1μs         84.0±2μs     1.11  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'direct', 5)
+       111±0.5μs          123±3μs     1.11  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'direct', 5)
+         170±1μs          187±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'mean', 'direct', 5)
+      25.8±0.2ms       28.5±0.2ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'describe', 'direct', 1)
+      12.7±0.2ms       14.0±0.5ms     1.10  algos.isin.IsinAlmostFullWithRandomInt.time_isin(<class 'numpy.object_'>, 18, 'outside')
+         120±5μs          133±3μs     1.10  groupby.GroupByMethods.time_dtype_as_field('int', 'median', 'direct', 1)
+         231±1ms          255±7ms     1.10  groupby.GroupByMethods.time_dtype_as_group('float', 'describe', 'direct', 5)
+         239±2μs          264±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'median', 'direct', 5)
+     2.25±0.05μs      2.48±0.07μs     1.10  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.Int8Engine'>, <class 'numpy.int8'>), 'monotonic_incr', False, 2000000)
+        99.7±2μs         110±10μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'size', 'direct', 5)
+      55.0±0.8μs         60.7±1μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'count', 'direct', 1)
+        467±10μs         515±10μs     1.10  groupby.GroupByMethods.time_dtype_as_field('int16', 'all', 'transformation', 1)
+         301±4μs          332±5μs     1.10  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'direct', 5)
+         168±5μs          186±8μs     1.10  groupby.GroupByMethods.time_dtype_as_field('object', 'cumcount', 'direct', 5)
+         103±2μs          113±2μs     1.10  groupby.GroupByMethods.time_dtype_as_field('int16', 'var', 'direct', 5)
+         277±1ms         305±10ms     1.10  io.csv.ReadCSVEngine.time_read_stringcsv('python')
+         161±2μs          178±3μs     1.10  groupby.GroupByMethods.time_dtype_as_field('object', 'first', 'direct', 1)
+       174±0.6ms          192±2ms     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'direct', 5)
+        88.4±1μs         97.4±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummax', 'direct', 5)
+         105±3μs          116±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('float', 'median', 'direct', 1)
+     3.45±0.06ms       3.80±0.1ms     1.10  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '.', 'high')
+         116±2μs          128±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'median', 'direct', 1)
+         431±3μs         475±20μs     1.10  groupby.GroupByMethods.time_dtype_as_field('datetime', 'cumcount', 'transformation', 1)
+         535±6μs         589±70μs     1.10  groupby.GroupByMethods.time_dtype_as_field('uint', 'first', 'transformation', 1)
+        99.2±2μs          109±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'cumprod', 'direct', 5)
+        72.1±1μs         79.4±1μs     1.10  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct', 1)
+        554±10μs         610±10μs     1.10  stat_ops.FrameOps.time_op('mean', 'float', 0)
+      9.78±0.3ms       10.8±0.7ms     1.10  io.csv.ToCSVDatetime.time_frame_date_formatting
+         341±5μs          376±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct', 5)
+        78.2±1ms         86.0±2ms     1.10  groupby.GroupByCythonAggEaDtypes.time_frame_agg('Int64', 'last')
+        86.4±1μs         95.1±4μs     1.10  groupby.GroupByMethods.time_dtype_as_field('uint', 'cummax', 'direct', 5)
+         554±5ms         610±20ms     1.10  io.csv.ToCSVDatetimeIndex.time_frame_date_formatting_index
+         339±6μs         373±10μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'first', 'direct', 5)
+      97.6±0.5ms          107±4ms     1.10  strings.Split.time_rsplit('string[pyarrow]', True)
+         120±4μs          132±3μs     1.10  groupby.GroupByMethods.time_dtype_as_field('float', 'first', 'direct', 5)
+        92.7±1μs          102±3μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'cumsum', 'direct', 5)
+        88.3±4ms         97.1±1ms     1.10  algos.isin.IsInLongSeriesLookUpDominates.time_isin('object', 1000, 'random_misses')
+      89.8±0.9μs         98.8±4μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'direct', 5)
+     2.09±0.01ms       2.29±0.2ms     1.10  strings.Methods.time_startswith('string[pyarrow]')
+     2.95±0.02ms       3.24±0.2ms     1.10  io.csv.ReadCSVFloatPrecision.time_read_csv_python_engine(';', '_', 'round_trip')
+        71.0±1μs         78.0±4μs     1.10  groupby.GroupByMethods.time_dtype_as_field('uint', 'cumsum', 'direct', 1)
+         116±2μs          128±3μs     1.10  groupby.GroupByMethods.time_dtype_as_group('datetime', 'max', 'direct', 1)
+     1.24±0.01ms      1.37±0.05ms     1.10  timeseries.ResampleDatetetime64.time_resample
+        89.5±3μs         98.4±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'cummax', 'direct', 5)
+        734±30μs         807±20μs     1.10  algorithms.Quantile.time_quantile(0.5, 'nearest', 'uint')
+      70.9±0.8μs         77.9±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'direct', 1)
+     7.13±0.06μs       7.83±0.1μs     1.10  timeseries.AsOf.time_asof_single_early('Series')
+      27.1±0.8ms         29.7±2ms     1.10  groupby.GroupByCythonAgg.time_frame_agg('float64', 'all')
+         690±9ms         758±10ms     1.10  join_merge.I8Merge.time_i8merge('right')
+        88.5±2μs         97.1±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('uint', 'cummin', 'direct', 5)
+        770±10μs          845±6μs     1.10  stat_ops.FrameOps.time_op('prod', 'float', 0)
+      64.7±0.9μs         71.1±1μs     1.10  groupby.GroupByMethods.time_dtype_as_field('int16', 'head', 'direct', 1)
+      3.85±0.1ms       4.22±0.3ms     1.10  join_merge.Concat.time_concat_series(0)
+        80.3±1μs         88.1±1μs     1.10  groupby.GroupByMethods.time_dtype_as_field('float', 'cumprod', 'direct', 1)
+     1.17±0.03ms       1.28±0.1ms     1.10  inference.ToDatetimeFromIntsFloats.time_nanosec_int64
+      5.51±0.1ms       6.04±0.2ms     1.10  groupby.String.time_str_func('str', 'first')
+         904±4ms         991±30ms     1.10  io.csv.ToCSVIndexes.time_head_of_multiindex
+        67.2±1μs         73.7±2μs     1.10  groupby.GroupByMethods.time_dtype_as_field('float', 'count', 'direct', 5)
+         319±3μs          350±3μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'sem', 'direct', 1)
+         156±3μs          171±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'cumcount', 'direct', 1)
+      76.4±0.8μs         83.6±1μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'cummin', 'direct', 1)
+         436±7μs         478±10μs     1.10  groupby.GroupByMethods.time_dtype_as_field('int', 'cumcount', 'transformation', 1)
+        76.4±1μs         83.7±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'direct', 1)
+      88.9±0.6μs         97.4±2μs     1.10  groupby.GroupByMethods.time_dtype_as_group('int16', 'cummin', 'direct', 5)
-         169±2ms          153±1ms     0.90  io.json.ToJSONLines.time_float_int_lines
-         130±2ms          118±5ms     0.90  io.json.ToJSONWide.time_to_json('index', 'df_int_float_str')
-      7.17±0.4ms       6.46±0.1ms     0.90  rolling.Pairwise.time_pairwise(({}, 'expanding'), 'cov', True)
-      3.87±0.1μs      3.49±0.06μs     0.90  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.UInt8Engine'>, <class 'numpy.uint8'>), 'monotonic_incr', False, 2000000)
-      8.39±0.2ms       7.55±0.2ms     0.90  algorithms.Duplicated.time_duplicated(False, False, 'datetime64[ns, tz]')
-        48.5±1ms       43.6±0.5ms     0.90  rolling.Pairwise.time_groupby(({'window': 10}, 'rolling'), 'corr', True)
-      7.30±0.1ms      6.56±0.09ms     0.90  indexing_engines.NumericEngineIndexing.time_get_loc_near_middle((<class 'pandas._libs.index.UInt8Engine'>, <class 'numpy.uint8'>), 'monotonic_decr', False, 2000000)
-      48.2±0.5μs       43.3±0.6μs     0.90  ctors.SeriesConstructors.time_series_constructor(<function no_change>, True, 'int')
-      67.9±0.8ms         60.9±1ms     0.90  io.json.ToJSONWide.time_to_json('values', 'df_date_idx')
-       180±0.7ms          161±1ms     0.89  io.json.ToJSONISO.time_iso_format('records')
-         146±1ms          131±2ms     0.89  io.json.ToJSONLines.time_delta_int_tstamp_lines
-        170±20μs          151±1μs     0.89  series_methods.NanOps.time_func('sem', 1000, 'Int64')
-     3.64±0.05ms       3.24±0.2ms     0.89  inference.ToDatetimeISO8601.time_iso8601_format
-        432±60μs          385±2μs     0.89  arithmetic.ApplyIndex.time_apply_index(<MonthBegin>)
-       170±0.8ms          151±1ms     0.89  io.json.ToJSONISO.time_iso_format('values')
-      51.3±0.9μs       45.5±0.6μs     0.89  ctors.SeriesConstructors.time_series_constructor(<function no_change>, True, 'float')
-         135±6μs          120±3μs     0.89  series_methods.Mode.time_mode(1000, 'int')
-     8.45±0.08ms      7.47±0.05ms     0.88  algorithms.Duplicated.time_duplicated(False, False, 'datetime64[ns]')
-        376±10μs          332±8μs     0.88  reindex.Reindex.time_reindex_columns
-        80.4±3ms         71.0±1ms     0.88  io.json.ToJSONWide.time_to_json('split', 'df_date_idx')
-      8.96±0.3ms      7.87±0.09ms     0.88  frame_methods.Shift.time_shift(0)
-     3.53±0.04ms      3.10±0.08ms     0.88  inference.ToDatetimeISO8601.time_iso8601_format_no_sep
-         136±2ms          119±2ms     0.87  io.json.ToJSON.time_to_json('index', 'df_int_floats')
-      1.55±0.2ms      1.34±0.01ms     0.87  rolling.Methods.time_method('Series', ('rolling', {'window': 1000}), 'int', 'mean')
-         113±1ms         97.9±2ms     0.87  io.json.ToJSONWide.time_to_json('records', 'df_int_float_str')
-         131±1ms          113±1ms     0.86  io.json.ToJSONWide.time_to_json('index', 'df_int_floats')
-       135±0.6ms          116±2ms     0.86  io.json.ToJSON.time_to_json('index', 'df_int_float_str')
-     5.43±0.07ms      4.68±0.07ms     0.86  algorithms.Duplicated.time_duplicated(False, False, 'uint')
-         120±1ms          103±3ms     0.86  io.json.ToJSONWide.time_to_json('index', 'df_td_int_ts')
-      1.94±0.2ms      1.66±0.03ms     0.86  rolling.Quantile.time_quantile('Series', 10, 'int', 1, 'higher')
-       97.7±20μs       83.5±0.7μs     0.85  series_methods.NanOps.time_func('median', 1000, 'Int64')
-      29.6±0.9ms       25.2±0.2ms     0.85  rolling.Pairwise.time_groupby(({'window': 1000}, 'rolling'), 'corr', False)
-      4.32±0.3ms      3.65±0.05ms     0.85  arithmetic.MixedFrameWithSeriesAxis.time_frame_op_with_series_axis1('lt')
-         113±2ms         95.2±1ms     0.84  io.json.ToJSONWide.time_to_json('records', 'df_int_floats')
-         126±1ms          106±2ms     0.84  io.json.ToJSON.time_to_json('index', 'df_td_int_ts')
-     2.32±0.04ms      1.94±0.02ms     0.84  categoricals.Indexing.time_align
-         118±1ms         98.3±2ms     0.84  io.json.ToJSON.time_to_json('records', 'df_int_floats')
-      98.0±0.4ms       81.6±0.8ms     0.83  io.json.ToJSONWide.time_to_json('split', 'df_int_floats')
-         118±3ms         98.2±2ms     0.83  io.json.ToJSON.time_to_json('records', 'df_int_float_str')
-         100±8μs       82.8±0.9μs     0.83  algos.isin.IsinAlmostFullWithRandomInt.time_isin(<class 'numpy.int64'>, 11, 'outside')
-       102±0.7ms         84.1±2ms     0.83  io.json.ToJSONWide.time_to_json('split', 'df_int_float_str')
-     4.40±0.08ms       3.63±0.1ms     0.82  algorithms.Duplicated.time_duplicated(False, 'first', 'uint')
-       100±0.8ms         82.2±1ms     0.82  io.json.ToJSONWide.time_to_json('records', 'df_td_int_ts')
-      12.8±0.2μs       10.5±0.2μs     0.82  period.Indexing.time_series_loc
-        11.5±1ms       9.39±0.2ms     0.82  groupby.GroupByMethods.time_dtype_as_field('int16', 'skew', 'direct', 5)
-      94.9±0.7ms         77.5±1ms     0.82  io.json.ToJSON.time_to_json('values', 'df_int_floats')
-       105±0.9ms         85.8±2ms     0.82  io.json.ToJSON.time_to_json('split', 'df_int_float_str')
-      3.24±0.3ms      2.64±0.02ms     0.82  rolling.Methods.time_method('DataFrame', ('rolling', {'window': 1000}), 'float', 'min')
-         104±1ms         84.2±1ms     0.81  io.json.ToJSON.time_to_json('split', 'df_int_floats')
-        60.9±1μs         49.2±2μs     0.81  inference.ToNumeric.time_from_str('ignore')
-       108±0.6ms         87.0±1ms     0.81  io.json.ToJSON.time_to_json('records', 'df_td_int_ts')
-        88.0±1ms       70.7±0.6ms     0.80  io.json.ToJSONWide.time_to_json('split', 'df_td_int_ts')
-        92.2±1ms         73.7±1ms     0.80  io.json.ToJSONWide.time_to_json('values', 'df_int_float_str')
-        31.1±3ms       24.8±0.2ms     0.80  rolling.Pairwise.time_groupby(({'window': 1000}, 'rolling'), 'cov', False)
-      95.6±0.7ms       76.2±0.8ms     0.80  io.json.ToJSON.time_to_json('values', 'df_int_float_str')
-        90.0±1ms       71.6±0.8ms     0.80  io.json.ToJSONWide.time_to_json('values', 'df_int_floats')
-      11.2±0.2μs       8.87±0.5μs     0.79  timedelta.TimedeltaIndexing.time_series_loc
-      93.5±0.7ms         73.8±4ms     0.79  groupby.DateAttributes.time_len_groupby_object
-      95.0±0.7ms       74.8±0.9ms     0.79  io.json.ToJSON.time_to_json('split', 'df_td_int_ts')
-      78.9±0.8ms         61.3±2ms     0.78  io.json.ToJSONWide.time_to_json('values', 'df_td_int_ts')
-        84.4±2ms         65.3±2ms     0.77  io.json.ToJSON.time_to_json('values', 'df_td_int_ts')
-       433±100μs          323±6μs     0.75  algos.isin.IsIn.time_isin('object')
-        208±50μs          151±4μs     0.73  algos.isin.IsIn.time_isin_empty('Int64')
-        305±80μs          218±2μs     0.71  algos.isin.IsIn.time_isin_categorical('string[pyarrow]')
-        75.6±5ms         53.3±2ms     0.71  timeseries.DatetimeIndex.time_to_pydatetime('tz_aware')
-        101±30μs         71.1±1μs     0.70  algos.isin.IsIn.time_isin_mismatched_dtype('datetime64[ns]')
-       85.0±10μs       59.2±0.6μs     0.70  algos.isin.IsIn.time_isin_mismatched_dtype('bool')
-      4.98±0.3ms      3.31±0.05ms     0.66  series_methods.Map.time_map('Series', 'object')
-        22.7±1ms       13.8±0.9ms     0.61  groupby.Apply.time_copy_overhead_single_col(5)
-         267±2ms        162±0.9ms     0.61  groupby.Apply.time_copy_overhead_single_col(4)
-      12.8±0.1μs       7.64±0.2μs     0.60  ctors.SeriesDtypesConstructors.time_index_from_array_floats
-        46.8±1μs       27.2±0.5μs     0.58  series_methods.ToFrame.time_to_frame('datetime64[ns]', None)
-        45.2±1μs       26.3±0.5μs     0.58  series_methods.ToFrame.time_to_frame('int64', None)
-      45.1±0.5μs       25.3±0.4μs     0.56  series_methods.ToFrame.time_to_frame('category', None)
-      45.9±0.8μs       25.6±0.4μs     0.56  series_methods.ToFrame.time_to_frame('Int64', None)
-      33.1±0.5ms       18.3±0.9ms     0.55  groupby.Apply.time_copy_function_multi_col(5)
-         898±8ms          436±2ms     0.49  groupby.Apply.time_copy_function_multi_col(4)
-     3.95±0.04ms       1.91±0.2ms     0.48  io.csv.ReadCSVDInferDatetimeFormat.time_read_csv(True, 'iso8601')
-     3.20±0.08μs      1.46±0.03μs     0.46  frame_methods.ToNumpy.time_to_numpy_tall
-     3.37±0.07μs      1.43±0.02μs     0.43  frame_methods.ToNumpy.time_to_numpy_wide
-     2.84±0.02μs      1.14±0.04μs     0.40  frame_methods.ToNumpy.time_values_wide
-     3.04±0.07μs      1.13±0.02μs     0.37  frame_methods.ToNumpy.time_values_tall
-         293±2μs         98.5±2μs     0.34  reshape.Explode.time_explode(100, 3)
-         504±4μs          109±1μs     0.22  reshape.Explode.time_explode(100, 5)
-     2.30±0.05ms          449±6μs     0.19  reshape.Explode.time_explode(1000, 3)
-     21.6±0.05ms      3.78±0.03ms     0.17  reshape.Explode.time_explode(10000, 3)
-      4.08±0.1ms          545±3μs     0.13  reshape.Explode.time_explode(1000, 5)
-        940±20μs          124±1μs     0.13  reshape.Explode.time_explode(100, 10)
-        39.8±1ms      4.75±0.06ms     0.12  reshape.Explode.time_explode(10000, 5)
-      8.49±0.2ms         710±20μs     0.08  reshape.Explode.time_explode(1000, 10)
-        82.7±1ms       6.43±0.1ms     0.08  reshape.Explode.time_explode(10000, 10)
-         261±2ms         16.7±1ms     0.06  inference.ToDatetimeInferDatetimeFormat.time_infer_datetime_format
-         132±1ms       7.20±0.3ms     0.05  inference.ToDatetimeISO8601.time_iso8601_infer_zero_tz_fromat

@mroeschke mroeschke added this to the 2.0 milestone Nov 21, 2022
@mroeschke
Copy link
Member

Guessing (hoping) those are mostly noisy benchmarks.

Maybe spot-check a few of the bad ones (like 1 benchmark per general "benchmark topic") with timeit just to confirm

@jbrockmendel
Copy link
Member Author

Maybe spot-check a few of the bad ones (like 1 benchmark per general "benchmark topic") with timeit just to confirm

Doing these on the first few shows perf unchanged vs main. Maybe I hadn't rebased when running asv before? Anyway, re-running some of the asvs now.

@jbrockmendel
Copy link
Member Author

re-ran everything that previously showed as over 1.40 and they all came back as unchanged, except for two groupby.Nth series benchmarks that came back as faster and pretty much have to be noise

@jreback
Copy link
Contributor

jreback commented Nov 22, 2022

lgtm would add a whatsnew note

@mroeschke mroeschke merged commit f04e8b0 into pandas-dev:main Nov 22, 2022
@mroeschke
Copy link
Member

Thanks @jbrockmendel

@jbrockmendel jbrockmendel deleted the api-consolidation branch November 22, 2022 21:28
mliu08 pushed a commit to mliu08/pandas that referenced this pull request Nov 27, 2022
* API: avoid silent consolidation

* update test

* fix ArrayManager xfail

* whatsnew
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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants