PERF: avoid object array cast in pd.isna
State: closed

- [x] closes #18856
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

#18856 is a fairly old issue about avoiding an object cast in the `_isna` method in `core/dtypes/missing.py`. AFAICT we never hit that clause in the method in our current testing suite. Modulo CI turning something up we should just delete it

Update: this *does* get hit. Looking into the ideas in #18856

Labels:
name: Missing-data
description: np.nan, pd.NaT, pd.NA, dropna, isnull, interpolate
name: Performance
description: Memory or execution speed performance
name: Benchmark
description: Performance (ASV) benchmarks

Comments:
asvs on this are a mixed bag. Running `asv continuous -f 1.1 upstream/master HEAD -b groupby -b categoricals -b rolling` gives
```
       before           after         ratio
     [1f42d456]       [cac9c205]
     <master>         <GH18856> 
+     1.61±0.04ms       3.16±0.4ms     1.96  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'lower')
+     1.57±0.04ms       3.07±0.4ms     1.95  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'nearest')
+     1.62±0.04ms       3.12±0.5ms     1.93  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'higher')
+      2.19±0.5ms       4.11±0.4ms     1.87  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'count')
+      2.21±0.5ms       3.84±0.3ms     1.74  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'count')
+     1.59±0.06ms       2.75±0.9ms     1.73  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'linear')
+     1.37±0.02ms       2.34±0.3ms     1.71  rolling.Quantile.time_quantile('Series', 10, 'int', 0, 'lower')
+     1.64±0.03ms       2.79±0.4ms     1.70  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'sum')
+     1.58±0.04ms       2.66±0.7ms     1.69  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'midpoint')
+     2.72±0.02ms       4.54±0.6ms     1.67  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'skew')
+     2.45±0.01ms       4.04±0.5ms     1.65  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'higher')
+     1.45±0.04ms       2.37±0.1ms     1.64  rolling.Quantile.time_quantile('Series', 1000, 'int', 1, 'linear')
+     1.70±0.02ms       2.77±0.3ms     1.63  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'mean')
+     1.65±0.02ms       2.68±0.3ms     1.63  rolling.VariableWindowMethods.time_rolling('DataFrame', '1h', 'int', 'sum')
+     2.47±0.02ms       3.95±0.5ms     1.60  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'lower')
+      2.86±0.5ms       4.53±0.6ms     1.59  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'std')
+     2.32±0.07ms       3.58±0.2ms     1.55  rolling.Quantile.time_quantile('Series', 1000, 'float', 1, 'nearest')
+      2.33±0.1ms       3.58±0.3ms     1.54  rolling.Quantile.time_quantile('Series', 1000, 'float', 1, 'lower')
+      1.48±0.1ms       2.27±0.1ms     1.53  rolling.Quantile.time_quantile('Series', 1000, 'int', 0, 'midpoint')
+     2.53±0.03ms       3.84±0.6ms     1.51  rolling.VariableWindowMethods.time_rolling('Series', '50s', 'int', 'skew')
+     1.53±0.02ms       2.25±0.1ms     1.47  groupby.RankWithTies.time_rank_ties('float64', 'first')
+      12.0±0.2ms       17.7±0.7ms     1.47  groupby.Nth.time_series_nth('object')
+     3.00±0.05ms       4.40±0.4ms     1.46  rolling.VariableWindowMethods.time_rolling('Series', '50s', 'int', 'kurt')
+     2.79±0.08ms       4.07±0.3ms     1.46  rolling.VariableWindowMethods.time_rolling('DataFrame', '1h', 'int', 'skew')
+      26.8±0.6ms         39.0±5ms     1.46  groupby.Nth.time_series_nth_all('float64')
+     2.30±0.07ms       3.34±0.3ms     1.45  rolling.Quantile.time_quantile('Series', 1000, 'float', 1, 'linear')
+     2.45±0.03ms       3.53±0.3ms     1.44  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'lower')
+        742±10μs      1.06±0.05ms     1.43  rolling.EWMMethods.time_ewm_times('Series', 10, 'float', 'mean')
+     1.36±0.02ms       1.95±0.3ms     1.43  rolling.Quantile.time_quantile('Series', 10, 'int', 0, 'linear')
+      3.10±0.6ms       4.43±0.2ms     1.43  rolling.VariableWindowMethods.time_rolling('DataFrame', '1h', 'int', 'min')
+     1.37±0.02ms       1.95±0.2ms     1.42  rolling.VariableWindowMethods.time_rolling('Series', '1h', 'float', 'sum')
+     2.93±0.03ms       4.13±0.3ms     1.41  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'min')
+     1.52±0.02ms       2.15±0.1ms     1.41  groupby.RankWithTies.time_rank_ties('float64', 'max')
+     2.37±0.03ms       3.35±0.3ms     1.41  rolling.Quantile.time_quantile('Series', 1000, 'float', 1, 'higher')
+     1.36±0.01ms       1.91±0.7ms     1.40  rolling.Quantile.time_quantile('Series', 10, 'int', 0, 'nearest')
+      24.1±0.2ms         33.3±2ms     1.38  groupby.Nth.time_groupby_nth_all('float32')
+     2.49±0.05ms       3.41±0.3ms     1.37  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'nearest')
+     2.46±0.02ms       3.35±0.4ms     1.36  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'higher')
+     1.38±0.02ms       1.88±0.3ms     1.36  rolling.Quantile.time_quantile('Series', 10, 'int', 0, 'midpoint')
+     2.92±0.07ms       3.98±0.2ms     1.36  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'max')
+     1.52±0.02ms       2.07±0.2ms     1.36  groupby.RankWithTies.time_rank_ties('float32', 'average')
+         489±9μs         662±60μs     1.35  groupby.GroupManyLabels.time_sum(1)
+         585±9μs         788±50μs     1.35  groupby.GroupByMethods.time_dtype_as_group('float', 'sem', 'direct')
+     2.80±0.04ms       3.76±0.2ms     1.34  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'max')
+     3.20±0.05ms       4.28±0.8ms     1.34  rolling.VariableWindowMethods.time_rolling('DataFrame', '1h', 'int', 'kurt')
+     1.51±0.01ms       2.02±0.2ms     1.33  groupby.RankWithTies.time_rank_ties('float64', 'dense')
+     1.58±0.02ms       2.11±0.2ms     1.33  rolling.VariableWindowMethods.time_rolling('Series', '1h', 'int', 'mean')
+         296±2μs         393±70μs     1.33  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'direct')
+        36.7±1ms         48.7±2ms     1.33  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'nearest')
+         297±3μs         393±80μs     1.32  groupby.GroupByMethods.time_dtype_as_group('datetime', 'min', 'transformation')
+     1.52±0.02ms       2.00±0.3ms     1.32  groupby.RankWithTies.time_rank_ties('float64', 'average')
+      59.4±0.6ms         78.1±2ms     1.31  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0.5, 'linear')
+         461±6μs         603±40μs     1.31  groupby.GroupByMethods.time_dtype_as_group('object', 'unique', 'transformation')
+        749±20μs         973±80μs     1.30  groupby.GroupByMethods.time_dtype_as_group('datetime', 'value_counts', 'direct')
+        36.9±1ms         47.9±5ms     1.30  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'higher')
+      24.2±0.3ms         31.0±6ms     1.28  groupby.Nth.time_groupby_nth_all('datetime')
+     1.37±0.01ms       1.76±0.6ms     1.28  rolling.Quantile.time_quantile('Series', 10, 'int', 0, 'higher')
+     2.52±0.08ms       3.20±0.6ms     1.27  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'midpoint')
+     1.41±0.02ms       1.80±0.4ms     1.27  rolling.Quantile.time_quantile('Series', 10, 'int', 1, 'midpoint')
+      42.2±0.7ms         53.5±3ms     1.27  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'midpoint')
+        1.07±0ms       1.36±0.4ms     1.27  rolling.ExpandingMethods.time_expanding('DataFrame', 'int', 'mean')
+         240±4μs         304±40μs     1.26  groupby.GroupByMethods.time_dtype_as_group('datetime', 'shift', 'direct')
+      59.7±0.4ms         74.7±6ms     1.25  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0.5, 'midpoint')
+      26.2±0.2ms         32.8±5ms     1.25  groupby.Nth.time_series_nth_all('float32')
+      2.53±0.1ms       3.15±0.2ms     1.25  rolling.Quantile.time_quantile('Series', 1000, 'float', 1, 'midpoint')
+         736±5μs         917±40μs     1.25  groupby.GroupByMethods.time_dtype_as_group('datetime', 'value_counts', 'transformation')
+         372±2μs         462±50μs     1.24  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'transformation')
+      2.62±0.3ms       3.26±0.2ms     1.24  rolling.Quantile.time_quantile('Series', 10, 'float', 1, 'midpoint')
+        42.9±2ms         53.3±5ms     1.24  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'linear')
+     1.54±0.03ms       1.90±0.2ms     1.24  groupby.RankWithTies.time_rank_ties('float64', 'min')
+     2.50±0.08ms       3.07±0.1ms     1.23  rolling.Quantile.time_quantile('Series', 10, 'float', 1, 'linear')
+         825±9μs       1.00±0.2ms     1.21  rolling.EWMMethods.time_ewm_times('DataFrame', 1000, 'float', 'std')
+     13.6±0.08ms         16.4±2ms     1.21  groupby.AggFunctions.time_different_str_functions
+      55.4±0.7ms         67.0±2ms     1.21  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0.5, 'higher')
+      37.7±0.8ms         45.6±2ms     1.21  rolling.Quantile.time_quantile('Series', 1000, 'int', 0.5, 'higher')
+      2.33±0.1μs      2.81±0.08μs     1.20  categoricals.Indexing.time_get_loc
+     2.78±0.02ms       3.34±0.3ms     1.20  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'min')
+         177±3μs          213±6μs     1.20  groupby.GroupByMethods.time_dtype_as_group('float', 'all', 'transformation')
+     2.18±0.04ms       2.61±0.3ms     1.20  rolling.ExpandingMethods.time_expanding('DataFrame', 'int', 'max')
+         456±6μs         545±20μs     1.20  groupby.GroupByMethods.time_dtype_as_group('datetime', 'quantile', 'transformation')
+      30.7±0.3ms         36.6±1ms     1.19  groupby.Nth.time_series_nth_all('object')
+     1.73±0.02ms       2.04±0.4ms     1.18  rolling.ExpandingMethods.time_expanding('Series', 'int', 'skew')
+         606±8μs         711±80μs     1.17  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'direct')
+      37.1±0.7ms         43.5±6ms     1.17  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'lower')
+         331±9μs         386±40μs     1.17  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'transformation')
+     1.06±0.02ms      1.24±0.08ms     1.17  rolling.ExpandingMethods.time_expanding('DataFrame', 'int', 'sum')
+         462±5μs         538±60μs     1.16  groupby.GroupByMethods.time_dtype_as_group('object', 'unique', 'direct')
+        92.4±1ms          108±9ms     1.16  rolling.ExpandingMethods.time_expanding('DataFrame', 'float', 'median')
+     2.45±0.02ms       2.83±0.6ms     1.16  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'std')
+     1.55±0.02ms       1.79±0.4ms     1.15  groupby.RankWithTies.time_rank_ties('datetime64', 'first')
+     1.34±0.01ms      1.55±0.08ms     1.15  rolling.ExpandingMethods.time_expanding('DataFrame', 'float', 'std')
+      27.3±0.5ms         31.3±1ms     1.15  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'median')
+         295±5μs         339±30μs     1.15  groupby.GroupByMethods.time_dtype_as_group('float', 'first', 'direct')
+        78.1±3ms        89.1±10ms     1.14  rolling.ExpandingMethods.time_expanding('DataFrame', 'int', 'median')
+         186±2μs          211±7μs     1.14  groupby.GroupByMethods.time_dtype_as_group('object', 'tail', 'direct')
+        730±20μs         828±50μs     1.13  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'transformation')
+      30.6±0.6ms         34.7±3ms     1.13  groupby.Nth.time_series_nth_any('object')
+     1.40±0.02ms       1.59±0.4ms     1.13  rolling.Quantile.time_quantile('Series', 10, 'int', 1, 'higher')
+     2.46±0.03ms       2.77±0.4ms     1.13  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'nearest')
+     2.46±0.04ms       2.77±0.4ms     1.13  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'linear')
+      3.86±0.2ms       4.34±0.2ms     1.12  rolling.Engine.time_expanding_apply('Series', 'int', <function sum>, 'cython')
+     1.94±0.02ms       2.18±0.2ms     1.12  rolling.ExpandingMethods.time_expanding('Series', 'float', 'max')
+         111±2ms          125±3ms     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'direct')
+         185±3μs         208±10μs     1.12  groupby.GroupByMethods.time_dtype_as_group('object', 'tail', 'transformation')
+         803±8μs         899±80μs     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'rank', 'transformation')
+         244±2μs         272±20μs     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'transformation')
+         112±2ms          124±7ms     1.12  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'transformation')
+     2.47±0.02ms       2.75±0.5ms     1.12  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 1, 'midpoint')
+      55.7±0.5ms         62.1±5ms     1.11  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0.5, 'nearest')
+      25.3±0.2ms       28.2±0.6ms     1.11  rolling.Quantile.time_quantile('Series', 10, 'float', 0.5, 'lower')
+      55.3±0.1ms         61.4±3ms     1.11  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0.5, 'lower')
+         333±8μs         370±30μs     1.11  groupby.GroupByMethods.time_dtype_as_group('float', 'bfill', 'direct')
+         841±7μs         931±40μs     1.11  rolling.ExpandingMethods.time_expanding('Series', 'float', 'mean')
+      28.1±0.4ms         31.0±1ms     1.10  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'int', 'median')
+         245±2μs         270±20μs     1.10  groupby.GroupByMethods.time_dtype_as_group('float', 'shift', 'transformation')
+     1.53±0.02ms       1.68±0.1ms     1.10  groupby.RankWithTies.time_rank_ties('float32', 'dense')
+         398±4μs         438±60μs     1.10  groupby.GroupByMethods.time_dtype_as_group('float', 'mean', 'direct')
-        9.43±1ms      8.57±0.03ms     0.91  groupby.Categories.time_groupby_ordered_nosort
-      6.52±0.8ms      5.89±0.04ms     0.90  categoricals.Rank.time_rank_int_cat_ordered
-      5.38±0.5ms      4.85±0.04ms     0.90  categoricals.Rank.time_rank_string_cat_ordered
-        370±50μs          333±2μs     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'direct')
-        563±20ms          504±7ms     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'direct')
-         124±8μs          111±1μs     0.90  groupby.GroupByMethods.time_dtype_as_group('int', 'size', 'transformation')
-        331±30μs          296±1μs     0.89  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct')
-        309±30μs          276±1μs     0.89  groupby.GroupByMethods.time_dtype_as_field('datetime', 'shift', 'transformation')
-        282±10μs          251±2μs     0.89  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation')
-        685±90μs          607±8μs     0.89  groupby.GroupByMethods.time_dtype_as_group('int', 'cummin', 'transformation')
-       809±100μs         698±10μs     0.86  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'direct')
-        382±40μs          330±3μs     0.86  groupby.GroupByMethods.time_dtype_as_group('int', 'ffill', 'transformation')
-         110±4ms       94.4±0.5ms     0.86  groupby.GroupByMethods.time_dtype_as_field('datetime', 'unique', 'transformation')
-       831±100μs          708±8μs     0.85  groupby.GroupByMethods.time_dtype_as_group('int', 'cumprod', 'transformation')
-        468±30μs          395±2μs     0.84  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'direct')
-        467±60μs          393±8μs     0.84  groupby.GroupByMethods.time_dtype_as_field('datetime', 'quantile', 'direct')
-         128±9μs          107±2μs     0.84  groupby.GroupByMethods.time_dtype_as_group('int', 'count', 'direct')
-        307±20μs          252±3μs     0.82  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'direct')
-      1.47±0.1ms         1.21±0ms     0.82  groupby.GroupByMethods.time_dtype_as_group('int', 'pct_change', 'direct')
-       730±100μs          598±8μs     0.82  groupby.GroupByMethods.time_dtype_as_group('int', 'cummax', 'direct')
-        263±10μs          215±2μs     0.82  groupby.GroupByMethods.time_dtype_as_group('int', 'head', 'transformation')
-        383±20μs          312±8μs     0.81  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'transformation')
-        716±60μs          576±6μs     0.80  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'direct')
-         279±8μs          218±4μs     0.78  groupby.GroupByMethods.time_dtype_as_group('int', 'head', 'direct')
-        378±30μs          295±4μs     0.78  groupby.GroupByMethods.time_dtype_as_group('int', 'first', 'transformation')
-        748±70μs          582±4μs     0.78  groupby.GroupByMethods.time_dtype_as_group('int', 'sem', 'transformation')
-        515±20μs          398±6μs     0.77  groupby.GroupByMethods.time_dtype_as_group('int', 'nunique', 'transformation')
-        383±20μs          290±4μs     0.76  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'transformation')
-        622±40μs          464±7μs     0.75  groupby.GroupByMethods.time_dtype_as_group('int', 'quantile', 'direct')
-        395±40μs          289±3μs     0.73  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct')
-        619±60μs         411±10μs     0.66  groupby.GroupByMethods.time_dtype_as_group('int', 'prod', 'direct')
-      7.10±0.8ms       4.12±0.5ms     0.58  gil.ParallelRolling.time_rolling('std')
-        8.41±2ms       4.51±0.1ms     0.54  gil.ParallelRolling.time_rolling('skew')
```
@jreback WDYT?
> asvs on this are a mixed bag

unfortunately it isnt unusual for asvs to have a lot of noise.  if you re-run just the ones that are supposedly changed, you can see which ones are consistent-ish changes and whittle down what we need to focus on
> > asvs on this are a mixed bag
> 
> unfortunately it isnt unusual for asvs to have a lot of noise. if you re-run just the ones that are supposedly changed, you can see which ones are consistent-ish changes and whittle down what we need to focus on

Sounds good, will do
Ran the benchmarks a few times. There is a consistent speed up in a bunch of the ops but there is a lot of variance in by how much. There are also slowdowns but they're not consistent.

WDYT? @jbrockmendel @jreback 

At the risk of posting spam, below are two runs for `asv continuous -f 1.01 upstream/master HEAD -b groupby -b categoricals -b rolling` (I lowered the threshold to get more info)
```
+      4.66±0.2ms       8.17±0.5ms     1.75  gil.ParallelRolling.time_rolling('var')
+     1.56±0.01ms       1.70±0.1ms     1.09  rolling.EWMMethods.time_ewm('Series', 1000, 'float', 'std')
+     3.93±0.02ms       4.22±0.2ms     1.07  rolling.ExpandingMethods.time_expanding_groupby('Series', 'float', 'sum')
+     4.02±0.04ms      4.30±0.05ms     1.07  rolling.Apply.time_rolling('DataFrame', 3, 'float', <function Apply.<lambda>>, True)
+     3.66±0.03ms      3.90±0.06ms     1.07  rolling.Engine.time_expanding_apply('Series', 'int', <function sum>, 'cython')
+     3.97±0.01ms      4.22±0.05ms     1.06  rolling.Apply.time_rolling('Series', 3, 'float', <function Apply.<lambda>>, True)
+     3.54±0.03ms      3.76±0.05ms     1.06  rolling.Apply.time_rolling('Series', 3, 'float', <function sum>, True)
+     2.59±0.02ms      2.74±0.01ms     1.06  rolling.Apply.time_rolling('Series', 300, 'int', <function sum>, True)
+     3.65±0.02ms      3.84±0.02ms     1.05  rolling.Engine.time_expanding_apply('Series', 'float', <function sum>, 'cython')
+     3.01±0.05ms      3.17±0.01ms     1.05  rolling.Apply.time_rolling('DataFrame', 300, 'float', <function Apply.<lambda>>, True)
+     3.72±0.03ms      3.91±0.02ms     1.05  rolling.Engine.time_expanding_apply('DataFrame', 'int', <function sum>, 'cython')
+     4.03±0.04ms      4.23±0.06ms     1.05  rolling.Apply.time_rolling('Series', 3, 'int', <function Apply.<lambda>>, True)
+     4.05±0.07ms      4.25±0.09ms     1.05  rolling.Engine.time_rolling_apply('DataFrame', 'float', <function Engine.<lambda>>, 'cython')
+     3.58±0.05ms      3.76±0.02ms     1.05  rolling.Engine.time_rolling_apply('DataFrame', 'int', <function sum>, 'cython')
+     3.59±0.04ms      3.77±0.05ms     1.05  rolling.Apply.time_rolling('Series', 3, 'int', <function sum>, True)
+     3.04±0.03ms      3.18±0.02ms     1.05  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function Apply.<lambda>>, True)
+     2.93±0.05ms      3.06±0.01ms     1.05  rolling.Apply.time_rolling('Series', 300, 'float', <function Apply.<lambda>>, True)
+     3.55±0.01ms      3.71±0.04ms     1.04  rolling.Engine.time_rolling_apply('Series', 'float', <function sum>, 'cython')
+     3.68±0.05ms      3.84±0.06ms     1.04  rolling.Apply.time_rolling('DataFrame', 3, 'int', <function sum>, True)
+     4.13±0.05ms      4.31±0.04ms     1.04  rolling.Engine.time_expanding_apply('Series', 'int', <function Engine.<lambda>>, 'cython')
+     3.76±0.02ms      3.92±0.02ms     1.04  rolling.Engine.time_expanding_apply('DataFrame', 'float', <function sum>, 'cython')
+     4.02±0.05ms      4.19±0.02ms     1.04  rolling.Engine.time_rolling_apply('Series', 'float', <function Engine.<lambda>>, 'cython')
+     2.70±0.01ms      2.82±0.01ms     1.04  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function sum>, True)
+     4.11±0.04ms      4.28±0.07ms     1.04  rolling.Apply.time_rolling('DataFrame', 3, 'int', <function Apply.<lambda>>, True)
+     3.61±0.02ms      3.76±0.02ms     1.04  rolling.Apply.time_rolling('DataFrame', 3, 'float', <function sum>, True)
+     2.96±0.03ms      3.07±0.02ms     1.04  rolling.Apply.time_rolling('Series', 300, 'int', <function Apply.<lambda>>, True)
+     4.18±0.06ms      4.32±0.03ms     1.04  rolling.Engine.time_expanding_apply('Series', 'float', <function Engine.<lambda>>, 'cython')
+     2.71±0.02ms      2.80±0.05ms     1.03  rolling.Apply.time_rolling('DataFrame', 300, 'float', <function sum>, True)
+     3.61±0.07ms      3.74±0.01ms     1.03  rolling.Engine.time_rolling_apply('DataFrame', 'float', <function sum>, 'cython')
+     4.24±0.03ms      4.38±0.03ms     1.03  rolling.Engine.time_expanding_apply('DataFrame', 'int', <function Engine.<lambda>>, 'cython')
+     4.24±0.04ms      4.36±0.01ms     1.03  rolling.Engine.time_expanding_apply('DataFrame', 'float', <function Engine.<lambda>>, 'cython')
+      92.3±0.4ms         94.7±1ms     1.03  rolling.Apply.time_rolling('DataFrame', 3, 'float', <function sum>, False)
+      93.5±0.1ms         95.8±1ms     1.02  rolling.Apply.time_rolling('Series', 3, 'float', <function Apply.<lambda>>, False)
+     3.55±0.04ms      3.64±0.03ms     1.02  rolling.Engine.time_rolling_apply('Series', 'int', <function sum>, 'cython')
+     4.09±0.04ms      4.18±0.06ms     1.02  rolling.Engine.time_rolling_apply('DataFrame', 'int', <function Engine.<lambda>>, 'cython')
+         294±1μs          300±2μs     1.02  groupby.GroupByMethods.time_dtype_as_group('float', 'last', 'transformation')
+       101±0.5ms        103±0.4ms     1.02  categoricals.Rank.time_rank_string
+      66.0±0.1ms       67.0±0.2ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function sum>, False)
+      91.7±0.3ms      93.1±0.06ms     1.01  rolling.Apply.time_rolling('Series', 3, 'float', <function sum>, False)
+         297±1μs        302±0.6μs     1.01  groupby.GroupByMethods.time_dtype_as_group('float', 'max', 'direct')
-      37.3±0.2ms       36.9±0.1ms     0.99  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0.5, 'nearest')
-         513±2ms          507±2ms     0.99  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'direct')
-       212±0.9μs        210±0.8μs     0.99  groupby.GroupByMethods.time_dtype_as_field('datetime', 'all', 'transformation')
-     1.43±0.06ms      1.41±0.01ms     0.99  rolling.Quantile.time_quantile('Series', 1000, 'int', 0, 'nearest')
-         513±3ms        507±0.5ms     0.99  groupby.GroupByMethods.time_dtype_as_group('int', 'mad', 'transformation')
-         1.72±0s       1.70±0.01s     0.99  groupby.Apply.time_copy_function_multi_col
-      43.6±0.3ms       43.1±0.1ms     0.99  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'int', 'median')
-     2.51±0.01ms      2.48±0.01ms     0.99  rolling.Methods.time_rolling('DataFrame', 1000, 'int', 'skew')
-         182±1μs        180±0.4μs     0.99  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'direct')
-      11.2±0.1ms      11.0±0.06ms     0.99  rolling.Pairwise.time_pairwise(1000, 'cov', True)
-         300±9μs        296±0.7μs     0.99  groupby.GroupByMethods.time_dtype_as_field('int', 'max', 'transformation')
-         540±2ms          533±4ms     0.99  groupby.Apply.time_copy_overhead_single_col
-     1.65±0.01ms      1.63±0.01ms     0.99  rolling.VariableWindowMethods.time_rolling('DataFrame', '1d', 'float', 'mean')
-         115±2ms        113±0.2ms     0.98  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'direct')
-         185±1μs        182±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'direct')
-       179±0.7μs        176±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'direct')
-     1.45±0.01ms      1.42±0.01ms     0.98  rolling.Methods.time_rolling('DataFrame', 1000, 'float', 'mean')
-     2.78±0.01ms      2.74±0.01ms     0.98  rolling.VariableWindowMethods.time_rolling('DataFrame', '1h', 'float', 'max')
-       186±0.7μs        183±0.6μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'any', 'direct')
-       182±0.5μs        178±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_group('datetime', 'all', 'transformation')
-         179±2μs        176±0.5μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'all', 'direct')
-         304±3μs          298±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'var', 'transformation')
-      51.3±0.1ms       50.4±0.1ms     0.98  groupby.GroupByMethods.time_dtype_as_field('object', 'unique', 'transformation')
-         180±1μs        177±0.8μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'all', 'transformation')
-         182±1μs        178±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'transformation')
-       211±0.6μs          207±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'std', 'direct')
-         303±2μs        297±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'direct')
-         179±2μs        175±0.9μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'all', 'transformation')
-     4.12±0.03ms      4.04±0.02ms     0.98  rolling.Pairwise.time_pairwise(1000, 'corr', False)
-         302±9μs          296±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'min', 'transformation')
-     3.53±0.04ms      3.45±0.01ms     0.98  groupby.CountMultiDtype.time_multi_count
-         184±2μs        181±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'transformation')
-         255±1μs          250±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'last', 'direct')
-     1.17±0.01ms         1.14±0ms     0.98  rolling.ForwardWindowMethods.time_rolling('DataFrame', 1000, 'float', 'sum')
-     1.11±0.01ms         1.08±0ms     0.98  rolling.ExpandingMethods.time_expanding('DataFrame', 'int', 'mean')
-        733±20μs          715±3μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'rank', 'transformation')
-       184±0.9μs        179±0.6μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'any', 'direct')
-         186±1μs        181±0.8μs     0.97  groupby.GroupByMethods.time_dtype_as_group('int', 'any', 'direct')
-         216±2μs        210±0.9μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'std', 'direct')
-      27.1±0.3ms       26.4±0.2ms     0.97  rolling.Quantile.time_quantile('Series', 10, 'float', 0.5, 'midpoint')
-     1.60±0.03ms      1.56±0.01ms     0.97  groupby.RankWithTies.time_rank_ties('int64', 'max')
-     28.1±0.09ms       27.2±0.1ms     0.97  groupby.Nth.time_frame_nth_any('datetime')
-        374±10μs          362±1μs     0.97  groupby.GroupByMethods.time_dtype_as_field('object', 'nunique', 'direct')
-         229±3μs          221±1μs     0.97  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'transformation')
-      25.5±0.3ms       24.6±0.2ms     0.97  rolling.Quantile.time_quantile('Series', 10, 'float', 0.5, 'lower')
-     3.41±0.03μs      3.28±0.02μs     0.96  categoricals.SearchSorted.time_categorical_contains
-     1.61±0.02ms      1.55±0.01ms     0.96  groupby.RankWithTies.time_rank_ties('datetime64', 'max')
-      14.4±0.2ms       13.8±0.2ms     0.96  groupby.AggFunctions.time_different_numpy_functions
-     1.49±0.05ms      1.43±0.01ms     0.96  rolling.Methods.time_rolling('DataFrame', 10, 'float', 'mean')
-     14.3±0.05ms      13.7±0.08ms     0.96  groupby.AggFunctions.time_different_str_functions
-         255±7ns          242±2ns     0.95  categoricals.IsMonotonic.time_categorical_index_is_monotonic_increasing
-        318±40μs          297±1μs     0.94  groupby.GroupByMethods.time_dtype_as_field('int', 'var', 'direct')
-        13.5±1ms       12.1±0.1ms     0.89  groupby.Nth.time_series_nth('object')
-         439±5ms         385±20ms     0.88  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'transformation')
-       671±100μs          575±3μs     0.86  groupby.GroupByMethods.time_dtype_as_field('float', 'cummin', 'direct')
-        451±50ms         384±20ms     0.85  groupby.GroupByMethods.time_dtype_as_field('float', 'mad', 'direct')
-        437±70μs          364±1μs     0.83  groupby.GroupByMethods.time_dtype_as_field('int', 'mean', 'direct')
-      1.71±0.4ms      1.43±0.01ms     0.83  rolling.Quantile.time_quantile('Series', 1000, 'int', 1, 'midpoint')
-      5.88±0.5ms       4.74±0.5ms     0.81  gil.ParallelRolling.time_rolling('max')

+      3.87±0.2ms       4.82±0.8ms     1.25  gil.ParallelRolling.time_rolling('var')
+         332±1μs          344±6μs     1.04  groupby.GroupByMethods.time_dtype_as_field('object', 'last', 'direct')
+     1.58±0.01ms      1.62±0.06ms     1.03  rolling.Quantile.time_quantile('DataFrame', 10, 'int', 0, 'nearest')
+         280±1μs          288±2μs     1.03  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'transformation')
+      30.4±0.1μs       31.0±0.2μs     1.02  categoricals.IsMonotonic.time_categorical_series_is_monotonic_increasing
+         280±1μs          286±2μs     1.02  groupby.GroupByMethods.time_dtype_as_group('object', 'last', 'direct')
+      66.8±0.3ms       68.2±0.2ms     1.02  rolling.Apply.time_rolling('DataFrame', 300, 'int', <function Apply.<lambda>>, False)
+     1.25±0.01ms      1.28±0.01ms     1.02  rolling.ForwardWindowMethods.time_rolling('Series', 10, 'int', 'min')
+     1.85±0.01ms      1.88±0.02ms     1.02  rolling.ForwardWindowMethods.time_rolling('Series', 10, 'int', 'kurt')
+         422±2μs          431±2μs     1.02  categoricals.Repr.time_rendering
+         338±2μs          345±4μs     1.02  groupby.GroupByMethods.time_dtype_as_field('object', 'first', 'direct')
+     1.59±0.01ms      1.62±0.02ms     1.02  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 1, 'lower')
+       264±0.9μs          268±1μs     1.02  groupby.GroupByMethods.time_dtype_as_field('float', 'sum', 'transformation')
+         396±2μs          402±1μs     1.01  groupby.GroupByMethods.time_dtype_as_group('int', 'median', 'transformation')
+         290±1μs          294±1μs     1.01  groupby.GroupByMethods.time_dtype_as_group('int', 'last', 'direct')
+     50.9±0.06ms       51.7±0.2ms     1.01  groupby.GroupByMethods.time_dtype_as_field('object', 'unique', 'direct')
+       296±0.7μs          300±2μs     1.01  groupby.GroupByMethods.time_dtype_as_group('int', 'min', 'direct')
+       244±0.9μs        248±0.8μs     1.01  groupby.GroupByMethods.time_dtype_as_group('object', 'ffill', 'transformation')
+     2.49±0.01ms      2.52±0.01ms     1.01  rolling.Quantile.time_quantile('DataFrame', 1000, 'float', 0, 'higher')
+         282±1μs          285±1μs     1.01  groupby.GroupByMethods.time_dtype_as_group('object', 'first', 'direct')
-         733±2μs          725±2μs     0.99  groupby.GroupByMethods.time_dtype_as_group('float', 'cumprod', 'transformation')
-         290±1μs        287±0.4μs     0.99  groupby.GroupByMethods.time_dtype_as_group('object', 'nunique', 'direct')
-         319±1μs        316±0.5μs     0.99  groupby.GroupByMethods.time_dtype_as_group('int', 'var', 'transformation')
-         616±3μs          608±3μs     0.99  groupby.GroupByMethods.time_dtype_as_group('datetime', 'cummin', 'transformation')
-      88.6±0.5ms       87.5±0.2ms     0.99  groupby.Groups.time_series_groups('int64_large')
-      20.7±0.1ms      20.5±0.05ms     0.99  groupby.ApplyDictReturn.time_groupby_apply_dict_return
-         302±1μs        298±0.8μs     0.99  groupby.GroupByMethods.time_dtype_as_group('datetime', 'first', 'transformation')
-       123±0.4ms        121±0.6ms     0.99  groupby.GroupByMethods.time_dtype_as_group('int', 'skew', 'direct')
-      19.1±0.1ms      18.9±0.06ms     0.99  groupby.Apply.time_scalar_function_multi_col
-         398±2μs          392±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'nunique', 'direct')
-      49.6±0.2ms      48.8±0.08ms     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'unique', 'transformation')
-         811±2ms          798±6ms     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'transformation')
-      72.7±0.2ms       71.6±0.3ms     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'unique', 'direct')
-         216±1μs          212±1μs     0.98  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'transformation')
-     3.65±0.02ms      3.59±0.02ms     0.98  rolling.Engine.time_rolling_apply('DataFrame', 'float', <function sum>, 'cython')
-       400±0.8μs          393±2μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'quantile', 'direct')
-      1.57±0.02s       1.54±0.01s     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'describe', 'transformation')
-     4.31±0.01ms      4.23±0.02ms     0.98  rolling.Engine.time_expanding_apply('DataFrame', 'int', <function Engine.<lambda>>, 'cython')
-     2.85±0.06ms      2.80±0.02ms     0.98  rolling.VariableWindowMethods.time_rolling('DataFrame', '50s', 'float', 'min')
-       108±0.5μs        106±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_group('object', 'count', 'direct')
-      24.5±0.1ms       24.0±0.2ms     0.98  groupby.Nth.time_groupby_nth_all('datetime')
-      67.9±0.3ms       66.5±0.4ms     0.98  rolling.Apply.time_rolling('Series', 300, 'int', <function Apply.<lambda>>, False)
-     2.62±0.02ms      2.56±0.01ms     0.98  rolling.Apply.time_rolling('Series', 300, 'float', <function sum>, True)
-         227±2μs        222±0.4μs     0.98  groupby.GroupByMethods.time_dtype_as_field('datetime', 'tail', 'direct')
-     1.48±0.02ms         1.44±0ms     0.98  rolling.VariableWindowMethods.time_rolling('Series', '1h', 'int', 'sum')
-     3.55±0.01ms      3.48±0.01ms     0.98  rolling.Engine.time_rolling_apply('Series', 'int', <function sum>, 'cython')
-         227±1μs          222±2μs     0.98  groupby.GroupByMethods.time_dtype_as_group('int', 'tail', 'direct')
-         183±1μs        179±0.7μs     0.98  groupby.GroupByMethods.time_dtype_as_field('float', 'any', 'transformation')
-      24.4±0.2ms       23.8±0.2ms     0.98  groupby.Nth.time_groupby_nth_all('float32')
-     2.97±0.04ms      2.90±0.02ms     0.98  rolling.Apply.time_rolling('Series', 300, 'int', <function Apply.<lambda>>, True)
-     2.97±0.02ms      2.90±0.02ms     0.98  rolling.Apply.time_rolling('Series', 300, 'float', <function Apply.<lambda>>, True)
-         384±2μs          375±1μs     0.98  groupby.GroupByMethods.time_dtype_as_group('datetime', 'nunique', 'direct')
-     4.05±0.05ms      3.96±0.01ms     0.98  rolling.Engine.time_rolling_apply('Series', 'int', <function Engine.<lambda>>, 'cython')
-         816±5ms          797±2ms     0.98  groupby.GroupByMethods.time_dtype_as_group('float', 'mad', 'direct')
-     4.11±0.04ms      4.02±0.04ms     0.98  rolling.Apply.time_rolling('DataFrame', 3, 'float', <function Apply.<lambda>>, True)
-     6.27±0.07ms      6.11±0.02ms     0.97  groupby.Apply.time_scalar_function_single_col
-     3.66±0.03ms      3.56±0.03ms     0.97  rolling.Apply.time_rolling('DataFrame', 3, 'int', <function sum>, True)
-      26.9±0.2ms       26.2±0.2ms     0.97  rolling.ForwardWindowMethods.time_rolling('Series', 10, 'float', 'median')
-         194±1ms          189±1ms     0.97  groupby.GroupByMethods.time_dtype_as_group('float', 'skew', 'direct')
-     3.70±0.03ms      3.61±0.02ms     0.97  rolling.Engine.time_expanding_apply('Series', 'float', <function sum>, 'cython')
-     4.05±0.05ms      3.95±0.02ms     0.97  rolling.Apply.time_rolling('Series', 3, 'float', <function Apply.<lambda>>, True)
-     4.15±0.05ms      4.04±0.03ms     0.97  rolling.Engine.time_rolling_apply('DataFrame', 'float', <function Engine.<lambda>>, 'cython')
-         215±2μs        209±0.6μs     0.97  groupby.GroupByMethods.time_dtype_as_field('int', 'head', 'direct')
-     4.30±0.07ms      4.18±0.03ms     0.97  rolling.Engine.time_expanding_apply('DataFrame', 'float', <function Engine.<lambda>>, 'cython')
-         217±2μs          211±2μs     0.97  groupby.GroupByMethods.time_dtype_as_field('datetime', 'head', 'direct')
-     1.28±0.02ms         1.24±0ms     0.97  rolling.ForwardWindowMethods.time_rolling('Series', 1000, 'int', 'min')
-         210±4μs          204±1μs     0.97  groupby.GroupByMethods.time_dtype_as_group('datetime', 'tail', 'transformation')
-     3.84±0.03ms      3.71±0.03ms     0.97  rolling.Engine.time_expanding_apply('DataFrame', 'float', <function sum>, 'cython')
-         117±1μs        113±0.7μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'transformation')
-         199±2μs          192±1μs     0.96  groupby.GroupByMethods.time_dtype_as_group('datetime', 'head', 'direct')
-         214±6μs          204±2μs     0.96  groupby.GroupByMethods.time_dtype_as_group('float', 'tail', 'direct')
-      4.22±0.1ms      4.02±0.05ms     0.95  rolling.Engine.time_rolling_apply('DataFrame', 'int', <function Engine.<lambda>>, 'cython')
-         121±6ms          114±1ms     0.95  groupby.GroupByMethods.time_dtype_as_group('datetime', 'unique', 'transformation')
-        194±10μs        183±0.6μs     0.94  groupby.GroupByMethods.time_dtype_as_group('datetime', 'any', 'transformation')
-      3.86±0.2ms      3.55±0.02ms     0.92  rolling.Engine.time_rolling_apply('DataFrame', 'int', <function sum>, 'cython')
-        126±10μs        113±0.4μs     0.89  groupby.GroupByMethods.time_dtype_as_group('datetime', 'count', 'direct')
-        287±40μs          247±1μs     0.86  groupby.GroupByMethods.time_dtype_as_group('datetime', 'bfill', 'direct')
-      3.46±0.3ms      2.69±0.01ms     0.78  rolling.VariableWindowMethods.time_rolling('Series', '50s', 'int', 'min')
-        4.98±1ms       3.56±0.3ms     0.72  gil.ParallelRolling.time_rolling('std')
-      5.49±0.8ms      3.44±0.07ms     0.63  gil.ParallelRolling.time_rolling('min')

```
Here are two runs with `asv continuous -f 1.1 upstream/master HEAD -b groupby -b categoricals -b rolling`:
```
       before           after         ratio
     [1f42d456]       [cac9c205]
     <master>         <GH18856> 
+         462±2μs        578±100μs     1.25  groupby.GroupByMethods.time_dtype_as_group('int', 'quantile', 'transformation')
+     1.26±0.01ms       1.57±0.2ms     1.25  rolling.Methods.time_rolling('Series', 10, 'float', 'mean')
+     1.58±0.01ms       1.92±0.3ms     1.22  rolling.VariableWindowMethods.time_rolling('Series', '50s', 'int', 'mean')
+     1.59±0.01ms       1.88±0.4ms     1.18  rolling.Quantile.time_quantile('DataFrame', 1000, 'int', 0, 'midpoint')
+       251±0.6μs         292±40μs     1.16  groupby.GroupByMethods.time_dtype_as_group('int', 'shift', 'transformation')
+     11.0±0.09ms       12.7±0.6ms     1.15  groupby.MultiColumn.time_col_select_numpy_sum
+     1.38±0.01ms       1.55±0.2ms     1.12  rolling.Methods.time_rolling('DataFrame', 10, 'int', 'sum')
+      19.3±0.1ms         21.3±1ms     1.11  groupby.Apply.time_scalar_function_multi_col
+     2.41±0.01ms       2.66±0.2ms     1.10  groupby.CountMultiInt.time_multi_int_count
-        6.08±1ms       3.84±0.2ms     0.63  gil.ParallelRolling.time_rolling('skew')
-      6.07±0.4ms       3.48±0.4ms     0.57  gil.ParallelRolling.time_rolling('max')

+          365±2μs         417±30μs     1.14  groupby.GroupByMethods.time_dtype_as_field('datetime', 'bfill', 'direct')
-        309±10μs          280±2μs     0.91  groupby.GroupByMethods.time_dtype_as_field('float', 'median', 'direct')
-        104±10ms       93.9±0.4ms     0.91  rolling.Apply.time_rolling('Series', 3, 'int', <function sum>, False)
-        661±90μs          597±4μs     0.90  groupby.GroupByMethods.time_dtype_as_field('float', 'cumprod', 'direct')
-        664±70μs          597±4μs     0.90  groupby.GroupByMethods.time_dtype_as_field('float', 'cumprod', 'transformation')
-      1.44±0.2ms      1.29±0.03ms     0.89  rolling.Apply.time_rolling('Series', 3, 'float', <built-in function sum>, True)
-      1.47±0.2ms      1.31±0.02ms     0.89  rolling.Apply.time_rolling('Series', 3, 'int', <built-in function sum>, True)
-        671±70μs          591±5μs     0.88  groupby.GroupByMethods.time_dtype_as_field('float', 'cumsum', 'direct')
-        295±60μs          251±2μs     0.85  groupby.GroupByMethods.time_dtype_as_group('object', 'bfill', 'direct')
-      3.93±0.2ms       3.22±0.2ms     0.82  gil.ParallelRolling.time_rolling('var')
```
its possible that our asvs are just not exerising this, can you craft one that makes a difference?
In general, when you are working on a specific performance improvement, for development it's much easier to create a small code example, and run that eg with `%timeit` while developing. 


> Update: this does get hit

Looking at the error from the tests, we are using `Series.array` in the `Series.count()`, and the reason it still gets hit then, is because our PandasArray returns False on this check ...

```
In [7]: isinstance(pd.array([1, 2, 3], dtype=float), ABCExtensionArray)
Out[7]: False

In [8]: pd.array([1, 2, 3], dtype=float)
Out[8]: 
<PandasArray>
[1.0, 2.0, 3.0]
Length: 3, dtype: float64
```
> isinstance(pd.array([1, 2, 3], dtype=float), ABCExtensionArray)

Thanks for this Joris! There is indeed a (moderate) speed up from adding the `hasna` check in that one case:

#### Set-up
``` python
In [7]: import numpy as np
   ...: import pandas as pd
   ...: 
   ...: N = 10**8
   ...: rng = np.random.default_rng()
   ...: data = rng.choice(np.ones(2**20), size=N)
   ...: arr = pd.array(data, dtype=int)
   ...: assert hasattr(arr, "isna")
```

#### Current branch
```
In [6]: %timeit pd.isna(arr)
13.5 ms ± 27.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
```
#### Master
```
In [11]: %timeit pd.isna(arr)
22.2 ms ± 598 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
```
Looking at 
https://github.com/pandas-dev/pandas/blob/bb929a637ca9d4f24ea78ee4cca9ee17b65a5c1e/pandas/core/arrays/numpy_.py#L258-L262
`PandasArray` is guaranteed to have an `isna` method so seems like adding `PandasArray` to the original check should work:
https://github.com/pandas-dev/pandas/blob/bb929a637ca9d4f24ea78ee4cca9ee17b65a5c1e/pandas/core/dtypes/missing.py#L159-L160
@jreback added benchmarks + CI green
> I am not sure we should add a special check for PandasArray (or add benchmarks for it).
> 
> PandasArray is not actually used internally (you can't store it in a Series or DataFrame, as we always convert it to a numpy Series when creating a block or an Index). So basically that are the only occasions we do an `isinstance(obj, ABCPandasArray)`
> 
> So as long as it is not actually used, we shouldn't add special checks for it elsewhere (like here in the `isna` code).
> (and if we would actually start using it, it will likely become a normal ABCExtensionArray, and then the change would also not be needed)

I'm fine with this or I can keep working on the changes. Either way I think that the OP can be closed once there is a decision.

cc @jreback @jbrockmendel 
agreed, closing as not an issue.