Table of Contents

Layout suite — reduction / copy / elementwise × memory layout × dtype

ratio = NumPy_ms / NumSharp_ms — >1.0 = NumSharp faster. ✅≥1.0 🟡≥0.5 🟠≥0.2 🔴<0.2. Layouts (8, harmonized with the cast subsystem): C, F (Fortran), T (transpose), strided [:, ::2], sliced (offset), negrow [::-1,:], negcol [:,::-1], bcast (stride-0). Fills the op-matrix's blind spot (it measures C-contiguous only). 100K + 1M elements, best-of-rounds.

Reduction (sum/min/max/prod, both axes)

Geomean by lay

size C F T strided negrow negcol sliced bcast
100K 1.10 ✅ 1.11 ✅ 1.10 ✅ 0.60 🟡 1.03 ✅ 0.73 🟡 0.91 🟡 0.83 🟡
1M 1.05 ✅ 1.01 ✅ 0.98 🟡 0.63 🟡 1.02 ✅ 0.72 🟡 0.81 🟡 0.75 🟡

Geomean by dt

size f64 f32 c128 dec f16 i32 i64
100K 1.11 ✅ 1.30 ✅ 0.97 🟡 0.12 🔴 1.05 ✅ 1.50 ✅ 1.14 ✅
1M 1.02 ✅ 1.28 ✅ 0.96 🟡 0.11 🔴 1.07 ✅ 1.31 ✅ 1.07 ✅

Geomean by op

size sum min max prod
100K 0.95 🟡 0.74 🟡 0.76 🟡 1.34 ✅
1M 0.95 🟡 0.67 🟡 0.68 🟡 1.32 ✅

Worst 15 cells (NumSharp slowest vs NumPy)

key NumSharp ms NumPy ms ratio
1M|dec|bcast|sum|ax0 7.3695 0.1408 0.02 🔴
1M|dec|bcast|sum|ax1 4.1086 0.1125 0.03 🔴
100K|dec|bcast|sum|ax0 0.7283 0.0204 0.03 🔴
1M|dec|T|sum|ax1 7.5294 0.2240 0.03 🔴
1M|dec|F|sum|ax1 7.5579 0.2255 0.03 🔴
100K|dec|C|sum|ax0 0.7326 0.0227 0.03 🔴
100K|dec|F|sum|ax1 0.7286 0.0227 0.03 🔴
100K|dec|T|sum|ax1 0.7284 0.0227 0.03 🔴
100K|dec|negrow|sum|ax0 0.7282 0.0230 0.03 🔴
1M|dec|negrow|sum|ax0 7.4363 0.2417 0.03 🔴
1M|dec|sliced|sum|ax0 7.2451 0.2436 0.03 🔴
100K|dec|sliced|sum|ax0 0.7190 0.0248 0.03 🔴
1M|dec|C|sum|ax0 5.5333 0.2184 0.04 🔴
100K|dec|negrow|sum|ax1 0.4159 0.0184 0.04 🔴
1M|i32|bcast|max|ax1 1.1684 0.0603 0.05 🔴

Copy / identity-ufunc (np.positive)

Geomean by lay

size C F T strided sliced negrow negcol bcast
100K 3.78 ✅ 2.96 ✅ 3.47 ✅ 1.55 ✅ 3.76 ✅ 3.95 ✅ 3.58 ✅ 4.26 ✅
1M 6.83 ✅ 6.29 ✅ 6.51 ✅ 3.32 ✅ 5.41 ✅ 6.04 ✅ 6.47 ✅ 9.24 ✅

Geomean by dt

size u8 i8 i16 u16 i32 u32 i64 u64 char f16 f32 f64 c128
100K 5.43 ✅ 4.13 ✅ 4.31 ✅ 4.58 ✅ 2.80 ✅ 2.76 ✅ 1.87 ✅ 1.51 ✅ 4.72 ✅ 4.89 ✅ 1.73 ✅ 1.28 ✅ 10.68 ✅
1M 10.08 ✅ 10.08 ✅ 8.28 ✅ 8.35 ✅ 4.46 ✅ 4.98 ✅ 3.65 ✅ 4.39 ✅ 7.96 ✅ 7.65 ✅ 4.17 ✅ 3.93 ✅ 5.93 ✅

Worst 15 cells (NumSharp slowest vs NumPy)

key NumSharp ms NumPy ms ratio
100K|f32|strided|pos 0.0285 0.0159 0.56 🟡
100K|f64|strided|pos 0.0312 0.0180 0.58 🟡
100K|i32|strided|pos 0.0286 0.0197 0.69 🟡
100K|u32|strided|pos 0.0285 0.0197 0.69 🟡
100K|f64|T|pos 0.0310 0.0277 0.89 🟡
100K|i64|strided|pos 0.0317 0.0299 0.94 🟡
100K|u64|strided|pos 0.0312 0.0298 0.96 🟡
100K|f64|C|pos 0.0281 0.0277 0.98 🟡
100K|i64|F|pos 0.0370 0.0364 0.98 🟡
100K|f64|F|pos 0.0305 0.0329 1.08 ✅
100K|u64|F|pos 0.0317 0.0364 1.15 ✅
100K|u64|T|pos 0.0310 0.0365 1.18 ✅
100K|u64|C|pos 0.0284 0.0364 1.28 ✅
1M|i32|strided|pos 0.2711 0.3486 1.29 ✅
100K|i8|strided|pos 0.0089 0.0117 1.31 ✅

Elementwise (add/mul/neg/abs/sqrt/less/copy)

Geomean by lay

size C F T strided sliced negrow negcol bcast
100K 1.26 ✅ 1.19 ✅ 1.15 ✅ 0.54 🟡 1.59 ✅ 1.55 ✅ 1.13 ✅ 1.46 ✅
1M 2.15 ✅ 1.96 ✅ 1.97 ✅ 0.99 🟡 2.38 ✅ 2.40 ✅ 1.49 ✅ 2.89 ✅

Geomean by dt

size f64 f32 c128 f16 i32 i64
100K 1.07 ✅ 0.86 🟡 2.61 ✅ 0.91 🟡 1.27 ✅ 0.98 🟡
1M 2.14 ✅ 2.34 ✅ 1.93 ✅ 1.12 ✅ 2.40 ✅ 2.05 ✅

Geomean by op

size add mul neg abs sqrt less copy
100K 1.44 ✅ 1.39 ✅ 1.30 ✅ 1.20 ✅ 0.93 🟡 0.87 🟡 1.26 ✅
1M 2.18 ✅ 2.17 ✅ 2.80 ✅ 2.44 ✅ 1.27 ✅ 0.88 🟡 2.88 ✅

Worst 15 cells (NumSharp slowest vs NumPy)

key NumSharp ms NumPy ms ratio
100K|i64|strided|add 0.1828 0.0256 0.14 🔴
100K|f64|strided|add 0.1900 0.0287 0.15 🔴
100K|f64|strided|mul 0.1833 0.0301 0.16 🔴
100K|i64|strided|mul 0.1831 0.0301 0.16 🔴
100K|f64|strided|neg 0.0943 0.0163 0.17 🔴
100K|f64|strided|abs 0.0931 0.0165 0.18 🔴
100K|f64|T|sqrt 0.2797 0.0552 0.20 🔴
100K|f32|strided|abs 0.0492 0.0098 0.20 🟠
100K|i64|strided|sqrt 0.1752 0.0408 0.23 🟠
100K|i32|bcast|sqrt 0.3200 0.0804 0.25 🟠
100K|f32|negcol|add 0.1845 0.0494 0.27 🟠
100K|i32|F|sqrt 0.2797 0.0778 0.28 🟠
100K|i32|strided|add 0.0932 0.0279 0.30 🟠
100K|i32|strided|mul 0.0930 0.0279 0.30 🟠
100K|f32|strided|add 0.0933 0.0286 0.31 🟠