NumSharp NDIter — canonical benchmark · 2026-06-29 · speedup = NumPy ÷ NumSharp (>1.0× = NumSharp faster)
198 measured pairs (35 NA) · best-of-rounds, Release · matched kernels/ids
%NumPy🕐 = NumSharp ÷ NumPy × 100 = share of NumPy's time NumSharp uses (8% = takes only 8% as long; <100% = faster)
AV POLICY — a NumSharp section that crashes all retries (known intermittent
AccessViolation, an unmanaged-storage lifetime bug) is reported NA / IGNORED
and excluded from every geomean below. THIS RUN: NA across selection.
HEADLINE — operation matrix: 1.20× geomean · 83%🕐 of NumPy's time · 77 win / 53 lose over 130 cells
OPERATIONS — BY SIZE TIER (geomean over all families)
slower ◄───────── 1.0 (parity) ─────────► faster
scalar ████████████▌ ...... 1.26× 79%🕐 ( 17 win / 9 lose)
1K ███████████▌ ....... 1.16× 86%🕐 ( 15 win / 11 lose)
100K ██████████▋ ........ 1.07× 94%🕐 ( 12 win / 14 lose)
1M ████████████▉ ...... 1.30× 77%🕐 ( 17 win / 9 lose)
10M ████████████▎ ...... 1.23× 82%🕐 ( 16 win / 10 lose)
ALL ███████████▉ ....... 1.20× 83%🕐 ( 77 win / 53 lose)
OPERATIONS — BY CATEGORY (geomean over its families, all sizes)
slower ◄───────── 1.0 (parity) ─────────► faster
elementwise████████████▊ ...... 1.28× 78%🕐 ( 31 win / 9 lose)
reductions █████████████████▍ 1.74× 57%🕐 ( 29 win / 11 lose)
selection (no data)
copy/cast ███████▎ ........... 0.73× 138%🕐 ( 9 win / 16 lose) ◄ SLOWER
index-math ███████▋ ........... 0.77× 130%🕐 ( 4 win / 6 lose) ◄ SLOWER
dtypes ███████████▌ ....... 1.16× 86%🕐 ( 4 win / 11 lose)
CATEGORY × TIER geomean
category scalar 1K 100K 1M 10M
elementwise 1.65× 1.54× 1.14× 1.10× 1.08×
reductions 2.68× 2.00× 1.51× 1.43× 1.38×
selection - - - - -
copy/cast 0.59× 0.53× 0.41× 1.40× 1.12×
index-math 0.34× 0.51× 0.99× 1.23× 1.26×
dtypes 0.70× 0.81× 1.87× 1.39× 1.44×
PER-FAMILY × TIER (NumPy ÷ NumSharp; >1.0 = NumSharp faster)
family scalar 1K 100K 1M 10M geomean
-- elementwise
add 1.61× 1.43× 0.96× 1.00× 1.02× 1.18×
sqrt 1.67× 1.16× 1.01× 1.00× 1.01× 1.15×
copy 1.67× 2.35× 1.62× 1.39× 1.64× 1.71×
strided 1.65× 1.28× 0.93× 1.01× 0.99× 1.15×
bcast 1.68× 1.32× 0.89× 0.95× 0.95× 1.12×
reversed 1.65× 1.26× 0.93× 0.99× 0.95× 1.13×
castbuf 1.87× 2.20× 1.63× 1.36× 1.12× 1.59×
mixbuf 1.42× 1.72× 1.41× 1.20× 1.07× 1.35×
-- reductions
sum 1.92× 1.85× 2.58× 1.76× 1.60× 1.92×
sum ax0 1.71× 0.86× 1.10× 0.96× 0.96× 1.09×
sum ax1 1.81× 0.92× 1.52× 1.79× 1.58× 1.48×
sum dt= 1.89× 1.35× 0.48× 0.46× 0.54× 0.79×
amin 1.69× 1.62× 0.71× 0.71× 0.76× 1.01×
cumsum 1.35× 1.13× 1.07× 1.87× 1.65× 1.38×
any(F) 10.04× 8.39× 2.00× 1.23× 1.00× 2.90×
any(hit) 10.25× 8.49× 8.50× 7.88× 7.98× 8.58×
-- selection
where NA NA NA NA NA
a[mask] NA NA NA NA NA
a[mask]= NA NA NA NA NA
count_nz NA NA NA NA NA
argwhere NA NA NA NA NA
a[idx] NA NA NA NA NA
a[idx]= NA NA NA NA NA
-- copy/cast
flatten 0.41× 0.33× 0.17× 2.21× 1.13× 0.56×
astype 0.31× 0.53× 0.54× 1.94× 1.89× 0.80×
ravel.T 0.50× 0.58× 0.53× 2.22× 1.09× 0.82×
in-place 1.45× 0.77× 0.96× 1.03× 1.04× 1.03×
less->b 0.81× 0.52× 0.25× 0.55× 0.75× 0.53×
-- index-math
unravel 0.36× 0.50× 0.96× 1.00× 1.04× 0.71×
ravel_mi 0.32× 0.53× 1.01× 1.53× 1.54× 0.83×
-- dtypes
complex 0.71× 0.58× 0.97× 0.77× 0.93× 0.78×
float16 0.72× 0.64× 0.58× 0.56× 0.57× 0.61×
int8 0.66× 1.43× 11.53× 6.16× 5.66× 3.28×
CONSTRUCTION — iterator build+dispose vs np.nditer (size-invariant, 1K)
slower ◄───────── 1.0 (parity) ─────────► faster
1op █████████▋ ......... 0.97× 103%🕐 ( 0 win / 1 lose) ◄ SLOWER
3op_exl ███████████████████▶ 2.44× 41%🕐 ( 1 win / 0 lose)
ufunc ███████████████████▶ 2.91× 34%🕐 ( 1 win / 0 lose)
bufcast ███████████████████▶ 2.56× 39%🕐 ( 1 win / 0 lose)
multiindex █████████████▉ ..... 1.40× 72%🕐 ( 1 win / 0 lose)
8op ███████████████████▶ 3.67× 27%🕐 ( 1 win / 0 lose)
4d █████████████████▊ 1.78× 56%🕐 ( 1 win / 0 lose)
8d ██████████████████▌ 1.85× 54%🕐 ( 1 win / 0 lose)
strided2d ███████████████████▌ 1.95× 51%🕐 ( 1 win / 0 lose)
geomean ███████████████████▶ 2.03× 49%🕐 ( 8 win / 1 lose)
CHUNK-WIDTH dispatch — strided rows, 2M total, inner width w (NumPy = np.positive)
slower ◄───────── 1.0 (parity) ─────────► faster
w=4 ██████▉ ............ 0.69× 145%🕐 ( 0 win / 1 lose) ◄ SLOWER
w=16 █████████▊ ......... 0.98× 102%🕐 ( 0 win / 1 lose) ◄ PARITY
w=64 ██████████▏ ........ 1.02× 98%🕐 ( 1 win / 0 lose) ◄ PARITY
w=256 ██████████████▌ .... 1.45× 69%🕐 ( 1 win / 0 lose)
w=1024 █████████████ ...... 1.31× 76%🕐 ( 1 win / 0 lose)
PATHOLOGY canaries — known taxes/losses to track (NumPy ÷ NumSharp)
bcast_reduce 522.42× (522.4× faster, faster)
allocate 1.06× (1.1× faster, faster)
overlap_copy 1.77× (1.8× faster, faster)
forder_out 1.17× (1.2× faster, faster)
zerodim 1.55× (1.6× faster, faster)
DIVIDENDS — NumSharp-only machinery (NumPy baseline = closest it can do)
scalar 1K 100K 1M 10M note
fuse7 12.55× 3.86× 1.44× 1.67× 2.09× vs chained 6× add
reuse 6.06× 6.12× 1.07× 1.00× 1.00× vs rebuild each call
par8 - 0.67× 2.78× 3.95× 5.40× vs single-thread
biggest NumSharp wins: i8@100K 11.53× · anyeh@1 10.25× · anyff@1 10.04× · anyeh@100K 8.50× · anyeh@1K 8.49×
most behind: flatten@100K 0.17× · lessbool@100K 0.25× · astype@1 0.31× · ravelmi@1 0.32× · flatten@1K 0.33×