Performance / 2026-11-08
Benchmarks
Codon speedups
Comparison runtime / Codon runtime. Higher than 1x favors Codon.
Applications
5 workloads / Full application inputs
Geometric mean speedup
- vs. CPython3.15.2
- 9.527x5 / 5 workloads
- vs. PyPy8.0.1
- 2.765x5 / 5 workloads
- vs. Clang C++23.1.5
- 2.162x3 / 5 workloads
| WorkloadLogarithmic scale / 1x = parity | vs. CPython 1x100x | vs. PyPy 1x100x | vs. Clang C++ 1x100x |
|---|---|---|---|
24.14x | 1.646x | Not implemented | |
5.08x | 2.541x | 2.257x | |
primesprimesCodon's parallel loop is configured with one OpenMP thread in this run. | 39.26x | 3.358x | Not implemented |
8.798x | 6.254x | 2.809x | |
1.852x | 1.839x | 1.594x |
Pyperformance
7 workloads / Full application inputs
Geometric mean speedup
- vs. CPython3.15.2
- 23.76x7 / 7 workloads
- vs. PyPy8.0.1
- 2.776x6 / 7 workloads
- vs. Clang C++23.1.5
- 1.233x2 / 7 workloads
| WorkloadLogarithmic scale / 1x = parity | vs. CPython 0.1x1x1,000x | vs. PyPy 0.1x1x1,000x | vs. Clang C++ 0.1x1x1,000x |
|---|---|---|---|
40.21x | 1.682x | 1.849x | |
chaoschaosOutput differs between runtimes. Floating-point rounding and the order of operations can accumulate in iterative calculations and change the final output. | 12.65x | 1.89x | Not implemented |
fannkuchfannkuchCodon uses 4 OpenMP threads (explicit in the source); other runtimes use one. | 17.09x | Timed out | Not implemented |
19.44x | 4.738x | Not implemented | |
11.69x | 5.669x | Not implemented | |
21.21x | 2.202x | 0.8221x | |
101.9x | 2.434x | Not implemented |
NPBench
53 workloads / Largest standard L preset
Geometric mean speedup
- vs. CPython3.15.2
- 2.859x53 / 53 workloads
- vs. Numba0.68.1
- 1.591x53 / 53 workloads
| WorkloadLogarithmic scale / 1x = parity | vs. CPython 0.1x1x1,000x | vs. Numba 0.1x1x1,000x |
|---|---|---|
5.451x | 1.104x | |
2.35x | 2.255x | |
1.273x | 1.532x | |
65.69x | 0.7739x | |
1.001x | 0.9946x | |
1.007x | 1.011x | |
1.491x | 1.508x | |
1.562x | 1.496x | |
15.13x | 1.047x | |
0.9893x | 0.8936x | |
3.472x | 1.568x | |
1.033x | 1.144x | |
9.189x | 10.17x | |
0.993x | 2.343x | |
1.002x | 2.293x | |
97.98x | 0.7562x | |
1.647x | 1.113x | |
0.9998x | 0.9975x | |
1.086x | 0.9957x | |
1.524x | 2.795x | |
1.017x | 2.83x | |
1.005x | 1.034x | |
0.9036x | 0.9778x | |
0.99x | 1.15x | |
1.039x | 1.441x | |
3.062x | 2.028x | |
1.621x | 4.801x | |
2.381x | 4.588x | |
2.083x | 2.606x | |
2.104x | 2.532x | |
0.9961x | 1.01x | |
0.9997x | 1.009x | |
6.747x | 11.21x | |
14.51x | 2.212x | |
15.71x | 2.325x | |
mandelbrot1mandelbrot1Output differs between runtimes. Floating-point rounding and the order of operations can accumulate in iterative calculations and change the final output. | 1.308x | 0.8143x |
1.02x | 1.001x | |
1.099x | 1.006x | |
0.9045x | 0.891x | |
1.106x | 0.9145x | |
329x | 1.203x | |
0.9991x | 4.478x | |
9.478x | 0.9994x | |
54.84x | 0.9635x | |
1.319x | 7.486x | |
51.6x | 1.817x | |
0.8504x | 1.337x | |
9.263x | 2.096x | |
12.45x | 1.233x | |
4.187x | 1.033x | |
1.536x | 1x | |
5.991x | 2.302x | |
0.9528x | 1.066x |
Methodology and reproducibility
One machine, two timing scopes
Apple M1 Max, 64 GiB RAM, macOS 26.6.2 (25G83), 10 logical CPUs. OpenMP and numerical libraries default to one worker. Codon's Fannkuch explicitly requests four OpenMP threads; its parallel Primes loop uses the one-thread default. Native compilation and input preparation finished before the serial timing sweep.
Pyperformance and Applications retain their original timing boundaries. Each measurement uses a fresh process, so allocation and any PyPy JIT work inside the timer are included. One preliminary process is excluded. NPBench uses one process per implementation, one warm-up, then three kernel-only measurements; Numba specialization, input reset, and output serialization are excluded.
These are software-stack comparisons, not isolated compiler comparisons. Native Codon links Apple Accelerate; NumPy and Numba use the libraries recorded under Setup. Numba fast math is disabled in every kernel and helper. Codon is compiled without -fast-math. Other upstream Numba options are retained. Results describe this hardware and these inputs, not a universal ranking.
Numba was remeasured on 2026-11-08, using the original input hashes for 52 kernels. MLP was remeasured on all three runtimes: its previously unseeded input now uses NumPy legacy RNG seed 42, shared across runtimes; its seeded weights are unchanged. A separate histogram update on 2026-11-08 uses the uniform implementation on all three runtimes. All other Codon and Python timings are retained from the original sweep.
Memory and output checks
NPBench uses identical initialized inputs and persistent pristine/working arrays. Working arrays are reset in place, with garbage collection outside the timer. A separate reset audit checks allocation and address stability. Live-heap observations are retained in the raw report and do not determine whether completed timings are displayed.
NPBench output checks use upstream pointwise tolerances or a relative L2-error threshold, with exact integer checks. Application values are compared with CPython; Chaos uses an exact PPM check. Completed timings are included when outputs differ, with a brief note on the affected benchmark. Rounding and the order of floating-point operations can affect iterative calculations; the original check results remain available in the raw report.
The process timeout is 900 seconds, including warm-up and output writing. 1 incomplete implementation run has no reported timing; the diagnostics are retained in the raw report.
Recorded environment
- Codon
- 0.20.6
- CPython
- 3.15.2
- PyPy
- 8.0.1 (Python 3.12.15)
- Clang
- 23.1.5
- NumPy
- 2.5.4
- Numba
- 0.68.1
- SciPy
- 1.18.1
- macOS SDK
- 14.5
Clang uses the matching macOS SDK libc++ headers and system runtime. The CUDA-only Codon Mandelbrot variant is not measured on this host; the existing CPU implementation is used instead.
Source and inputs
Codon commit 14aaa30ab594; local binary and source fingerprints are included in the raw report. NPBench commit f2d7f27d87ba, always the largest standard L preset.
TAQ uses the first 10 million lines of EQY_US_ALL_NBBO_20220301. Word count uses 5.442 MiB of input-text.clean.txt, ending at a complete line. Dataset hashes and array dimensions are recorded; external input files are not redistributed.
The Numba MLP source corrects an upstream softmax maximum-axis error. Azimuthal histogram integration uses the same portable weighted-histogram helpers across Codon, Python, and Numba. Python interprets the weighted loop; unweighted counts use each runtime's np.histogram. Each implementation has three measured samples. Other compatibility adaptations are listed per implementation. Exact executed kernel/application sources and raw samples accompany the results.