Host
Intel Core Ultra 9 285K · 24 cores
Platform
linux/amd64
Go
go1.26.0
CPython
python:3.13-slim
PyPy
pypy:3.10-slim
Runs / combo
10 + 2 warmup

Parallel word count (Monte Cristo)

Parallel word-frequency count over ~2.7 MB of Project Gutenberg text. Each runner uses its idiomatic CPU-parallel primitive.

Runtime · median per inner-loop window

median of 10 runs

Native Gocompiled
19.0 ms0.18×
Piko interpbytecode VM
108 msbaseline
CPython 3.13bytecode VM
181 ms1.68×
PyPy 7.3tracing JIT
353 ms3.28×
Ttengobytecode VM
n/a
Sscriggobytecode VM
n/a
Mmvmbytecode VM
302 ms2.80×
YyaegiAST walker
n/a

Full statistics

RunnerNCompileRuntimeP95StddevRSSvs pikoStatus
Native Gocompiled10181 ms19.0 ms21.2 ms1.35 ms72 MiB0.18×OK
Piko interpbytecode VM104.11 ms108 ms110 ms2.48 ms418 MiB1.00×OK
CPython 3.13bytecode VM10671 µs181 ms184 ms1.70 msn/a1.68×OK
PyPy 7.3tracing JIT10540 µs353 ms359 ms5.10 msn/a3.28×OK
tengobytecode VM0n/an/an/an/an/an/aunsupported
scriggobytecode VM0n/an/an/an/an/an/aunsupported
mvmbytecode VM10679 µs302 ms307 ms4.57 ms93 MiB2.80×OK
yaegiAST walker0n/an/an/an/an/an/aunsupported
Workload & symmetry rules

Workload

  1. Load The Count of Monte Cristo (Project Gutenberg #1184) corpus from disk.
  2. Split into 16 word-aligned chunks.
  3. Spawn 16 workers (goroutine + WaitGroup on Go/piko; multiprocessing.Pool on Python).
  4. Each worker tokenises via byte-walk and builds a local word → count map.
  5. Merge maps, compute top-50 by (count desc, word asc) via hand-rolled insertion-sort.

Symmetry rules

  • Each runner uses its idiomatic CPU-parallel primitive. Python's multiprocessing.Pool (not threading, because of the GIL).
  • No str.split, no regexp, no sort.*/sorted(key=...): tokenisation and ranking are hand-rolled.

Why this benchmark exists

Directly measures the GIL-free advantage. Piko inherits Go's goroutine scheduler; CPython has to fork.

Source code