Generated by python/benchmarks/bench_vs_arch.py. Every number below comes from the one machine listed here;
the ratios compare runs on that machine only and say nothing about another one.
The matched-work rows fit the same simulated series (GARCH(1,1) with Student-t(8) innovations, default_rng(7))
with the same specs: constant mean, sGARCH(p,q) and normal, Student-t or GED innovations. volengine runs with
Context(threads=1) and var_init="backcast", the arch convention; arch runs with rescale=False and
fit(disp="off"), one fit after the other. Each timing is the total wall time of all fits.
- Machine: AMD Ryzen 7 5700X 8-Core Processor, 8 cores, 16 hardware threads, 32 GiB RAM, Windows-10-10.0.19045-SP0
- Versions: volengine 0.1.0, arch 8.0.0, numpy 2.5.4, Python 3.14.7
- Date: 2026-11-11
- Work: 20 series of 5000 observations, 9 specs, 180 fits per library; median wall time of 5 repetitions.
| Run | Wall time (s) | Fits per second | Relative to arch on this machine |
|---|---|---|---|
| arch, sequential (matched work) | 5.73 | 31.4 | 1.00x |
| volengine, threads=1 (matched work) | 3.12 | 57.7 | 1.84x |
| volengine, threads=0 (all cores; not matched work) | 0.56 | 319.1 | 10.15x |
| Spec | Worst relative loglik difference over the series |
|---|---|
| sGARCH(1,1) norm | 5.1e-11 |
| sGARCH(1,1) std | 3.4e-11 |
| sGARCH(1,1) ged | 4.3e-11 |
| sGARCH(2,1) norm | 1.0e-09 |
| sGARCH(2,1) std | 4.0e-10 |
| sGARCH(2,1) ged | 2.2e-09 |
| sGARCH(1,2) norm | 5.7e-09 |
| sGARCH(1,2) std | 1.2e-09 |
| sGARCH(1,2) ged | 9.6e-10 |
Notes:
- Not measured yet:
python/benchmarks/bench_vs_arch.pyalso times sGARCH(1,1) withsstdinnovations againstarch'sskewt(the same family; the log-likelihoods are compared, not the parameterizations). The tables above predate that row and were not regenerated, so they show no number for it. - The optimizers differ (L-BFGS in VolEngine, SLSQP in
arch), so the times include different numbers of iterations. The second table shows that both reach the same optimum: the largest relative difference of the log-likelihood over the 20 series is below 1e-4 for every spec (the script fails otherwise). - The
threads=0row is not matched work:archdoes not parallelize a fit, so that row measures the batch parallelism of VolEngine, not the algorithms. Fits are bit-identical for any thread count. - The run was not isolated: a normal desktop session, no pinned cores and no fixed frequency.
- Reproduce with
VOLENGINE_LIB=<path to the library> python python/benchmarks/bench_vs_arch.py --out docs/performance/python-vs-arch.mdin thepython/.venvenvironment.