1-D Array Benchmarks

Reduce 1-D array into a single value.

Run the benchmark locally with (the script prints plain finite-data results first, then NaN-aware results):

uv run --extra bench python benchmarks/benchmark_1d.py

The benchmark prints one row per (length, dtype, function). np, bn, and rd are trimmed median elapsed µs for NumPy, Bottleneck, and reducers: the fastest and slowest samples are dropped before taking the median. The np/rd and bn/rd columns are speedups relative to reducers; a value above 1 means reducers is faster. A speedup is bolded when reducers ratio > 0.95.

Each run uses 3 warmups and 15 repeats by default.

average rows use one weight per value, generated from a uniform distribution on [0.5, 1.5). The percentile/quantile rows (and their nan* forms) request three positions, [16, 50, 84] (the median and +/-1 sigma).

Plain, float64

These rows compare the plain path on finite data. std uses ddof=1. For average, Bottleneck has no weighted-average reducer.

function np (µs) rd (µs) np/rd
mean 1.15 0.13 9.11x
average 2.81 0.29 9.62x
median 4.72 0.25 18.70x
sum 0.80 0.14 5.89x
min 0.79 0.14 5.80x
max 0.80 0.14 5.70x
minmax 1.62 0.15 10.57x
var 3.70 0.19 19.54x
std 3.94 0.25 15.80x
percentile 14.38 3.58 4.02x
quantile 14.01 3.82 3.67x
function np (µs) rd (µs) np/rd
mean 1.18 0.14 8.42x
average 2.79 0.31 8.86x
median 4.87 0.37 13.06x
sum 0.78 0.13 6.09x
min 0.81 0.15 5.57x
max 0.79 0.14 5.64x
minmax 1.62 0.17 9.66x
var 3.60 0.20 17.64x
std 3.86 0.27 14.21x
percentile 14.48 3.92 3.69x
quantile 13.97 4.23 3.30x
function np (µs) rd (µs) np/rd
mean 2.46 1.53 1.61x
average 7.89 2.34 3.37x
median 28.92 15.96 1.81x
sum 2.00 1.53 1.31x
min 1.37 1.40 0.98x
max 1.35 1.40 0.96x
minmax 2.75 1.71 1.60x
var 9.28 3.61 2.57x
std 9.73 3.86 2.52x
percentile 51.84 39.41 1.32x
quantile 50.49 39.32 1.28x
function np (µs) rd (µs) np/rd
mean 1242.83 1405.92 0.88x
average 4483.08 1895.38 2.37x
median 70200.50 15501.21 4.53x
sum 1249.71 1412.08 0.89x
min 951.12 397.88 2.39x
max 966.00 420.12 2.30x
minmax 1912.75 425.13 4.50x
var 5283.50 3547.08 1.49x
std 5274.63 3551.08 1.49x
percentile 114862.92 37314.75 3.08x
quantile 116236.92 37130.62 3.13x

Plain, float32

These rows compare the plain path on finite float32 data. std uses ddof=1. For average, Bottleneck has no weighted-average reducer.

function np (µs) rd (µs) np/rd
mean 1.95 0.15 13.29x
average 2.66 0.33 8.11x
median 5.47 0.23 23.40x
sum 0.77 0.15 5.27x
min 0.77 0.15 5.04x
max 0.77 0.15 5.10x
minmax 1.56 0.17 9.22x
var 4.53 0.20 22.91x
std 4.91 0.26 18.59x
percentile 14.51 3.52 4.13x
quantile 14.26 3.80 3.76x
function np (µs) rd (µs) np/rd
mean 1.94 0.17 11.71x
average 2.74 0.36 7.64x
median 5.74 0.38 15.28x
sum 0.77 0.15 5.01x
min 0.80 0.16 4.87x
max 0.78 0.16 4.93x
minmax 1.62 0.18 8.79x
var 4.54 0.23 19.77x
std 4.89 0.29 16.89x
percentile 14.75 3.86 3.82x
quantile 14.11 4.21 3.35x
function np (µs) rd (µs) np/rd
mean 3.21 1.67 1.92x
average 6.58 3.44 1.91x
median 29.79 14.69 2.03x
sum 1.90 1.71 1.11x
min 1.03 1.40 0.74x
max 1.01 1.39 0.72x
minmax 2.08 1.71 1.22x
var 8.46 3.97 2.13x
std 8.92 3.97 2.24x
percentile 50.17 37.05 1.35x
quantile 50.16 37.03 1.35x
function np (µs) rd (µs) np/rd
mean 1149.54 1644.46 0.70x
average 3323.54 3105.29 1.07x
median 77016.87 14371.58 5.36x
sum 1143.33 1593.33 0.72x
min 439.37 318.08 1.38x
max 453.38 308.62 1.47x
minmax 883.67 357.13 2.47x
var 3592.25 3757.00 0.96x
std 3614.29 3708.42 0.97x
percentile 114627.62 35568.00 3.22x
quantile 114870.21 35316.00 3.25x

NaN-aware, float64

These rows compare rd.nan* against np.nan* and bn.nan*. nanstd uses ddof=1. For nanaverage, the NumPy baseline masks a and weights before calling np.average; Bottleneck has no weighted-average reducer.

function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 4.25 0.07 0.15 28.82x 0.49x
nanaverage 3.06 - 0.30 10.08x -
nanmedian 6.47 0.10 0.24 26.92x 0.43x
nansum 1.74 0.07 0.15 11.84x 0.49x
nanmin 1.55 0.06 0.15 10.60x 0.39x
nanmax 1.57 0.06 0.15 10.71x 0.39x
nanminmax 3.14 0.11 0.17 19.00x 0.67x
nanvar 9.57 0.12 0.20 47.22x 0.59x
nanstd 10.35 0.16 0.29 36.11x 0.57x
nanpercentile 16.65 - 3.50 4.76x -
nanquantile 16.08 - 3.79 4.24x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 4.33 0.16 0.17 25.06x 0.92x
nanaverage 3.18 - 0.32 9.88x -
nanmedian 6.79 0.21 0.36 18.69x 0.59x
nansum 1.76 0.15 0.16 11.07x 0.97x
nanmin 1.59 0.09 0.16 10.28x 0.56x
nanmax 1.58 0.09 0.16 9.86x 0.55x
nanminmax 3.26 0.17 0.18 18.13x 0.93x
nanvar 9.62 0.29 0.24 39.57x 1.20x
nanstd 10.22 0.35 0.31 32.49x 1.10x
nanpercentile 26.78 - 4.04 6.63x -
nanquantile 16.75 - 5.62 2.98x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 17.68 19.39 5.89 3.00x 3.29x
nanaverage 20.52 - 3.40 6.04x -
nanmedian 37.00 23.96 20.74 1.78x 1.16x
nansum 8.51 14.79 3.99 2.13x 3.70x
nanmin 2.28 5.23 1.45 1.58x 3.62x
nanmax 2.29 5.31 1.55 1.48x 3.43x
nanminmax 5.70 10.27 1.83 3.11x 5.61x
nanvar 35.03 31.62 7.16 4.89x 4.41x
nanstd 34.39 34.96 8.14 4.23x 4.30x
nanpercentile 67.52 - 57.25 1.18x -
nanquantile 80.25 - 42.12 1.91x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 6860.37 12986.58 5381.96 1.27x 2.41x
nanaverage 12966.96 - 2600.71 4.99x -
nanmedian 55754.29 62285.00 17180.88 3.25x 3.63x
nansum 5483.00 12445.46 3228.96 1.70x 3.85x
nanmin 973.17 5182.71 423.42 2.30x 12.24x
nanmax 955.54 5059.75 437.67 2.18x 11.56x
nanminmax 1976.50 9903.83 407.29 4.85x 24.32x
nanvar 17407.50 25080.29 6146.75 2.83x 4.08x
nanstd 17286.87 24883.71 6145.12 2.81x 4.05x
nanpercentile 118428.96 - 38616.58 3.07x -
nanquantile 118718.75 - 38961.83 3.05x -

NaN-aware, float32

These rows compare float32 rd.nan* against np.nan* and bn.nan*. nanstd uses ddof=1. For nanaverage, the NumPy baseline masks a and weights before calling np.average; Bottleneck has no weighted-average reducer.

function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 5.32 0.07 0.18 30.27x 0.42x
nanaverage 3.17 - 0.36 8.81x -
nanmedian 9.78 0.11 0.26 38.22x 0.41x
nansum 1.83 0.07 0.17 10.81x 0.43x
nanmin 1.61 0.06 0.17 9.56x 0.37x
nanmax 1.59 0.06 0.17 9.31x 0.33x
nanminmax 3.18 0.11 0.18 17.33x 0.60x
nanvar 10.80 0.12 0.24 44.89x 0.50x
nanstd 11.36 0.16 0.29 39.84x 0.56x
nanpercentile 17.05 - 3.49 4.88x -
nanquantile 17.03 - 3.85 4.42x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 5.30 0.16 0.19 28.19x 0.83x
nanaverage 3.25 - 0.38 8.46x -
nanmedian 7.92 0.21 0.38 20.87x 0.56x
nansum 1.82 0.15 0.18 9.92x 0.84x
nanmin 1.60 0.09 0.18 9.08x 0.51x
nanmax 1.56 0.09 0.18 8.69x 0.49x
nanminmax 3.14 0.17 0.20 15.54x 0.82x
nanvar 11.39 0.30 0.27 42.08x 1.12x
nanstd 11.64 0.34 0.33 35.53x 1.03x
nanpercentile 17.44 - 3.97 4.40x -
nanquantile 16.96 - 4.23 4.01x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 12.26 11.44 3.18 3.85x 3.60x
nanaverage 14.80 - 3.86 3.83x -
nanmedian 32.12 20.91 17.91 1.79x 1.17x
nansum 6.11 12.31 2.98 2.05x 4.13x
nanmin 1.85 4.77 1.37 1.35x 3.48x
nanmax 1.87 4.50 1.24 1.50x 3.62x
nanminmax 3.83 9.52 1.62 2.36x 5.86x
nanvar 27.69 25.00 6.33 4.37x 3.95x
nanstd 27.56 25.06 6.18 4.46x 4.05x
nanpercentile 56.69 - 39.34 1.44x -
nanquantile 57.54 - 39.80 1.45x -
function np (µs) bn (µs) rd (µs) np/rd bn/rd
nanmean 5383.63 11343.13 3067.08 1.76x 3.70x
nanaverage 10844.63 - 3854.04 2.81x -
nanmedian 74681.58 58510.08 14937.17 5.00x 3.92x
nansum 3568.08 11215.92 3017.08 1.18x 3.72x
nanmin 426.00 4730.37 308.08 1.38x 15.35x
nanmax 449.50 4656.54 310.79 1.45x 14.98x
nanminmax 907.71 9253.00 318.00 2.85x 29.10x
nanvar 14054.17 24633.04 5999.33 2.34x 4.11x
nanstd 14135.12 25003.75 5960.54 2.37x 4.19x
nanpercentile 111802.79 - 35897.71 3.11x -
nanquantile 110976.12 - 35670.29 3.11x -