Host
Intel Core Ultra 9 285K · 24 cores
Platform
linux/amd64
Go
go1.27.0
CPython
python:3.14-slim
PyPy
pypy:3.11-slim
Runs / combo
7 + 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.

Compile time · median (cold)

median of 7 runs

Native Gocompiled
113 ms34.3×
Pipitbytecode VM
3.29 msbaseline
CPython 3.14bytecode VM
843 µs0.26×
PyPy 7.3tracing JIT
602 µs0.18×
Ttengobytecode VM
n/a
Sscriggobytecode VM
n/a
Mmvmbytecode VM
800 µs0.24×
YyaegiAST walker
n/a

Full statistics

RunnerNCompileRuntimeP95StddevRSSvs pipitStatus
Native Gocompiled7113 ms22.9 ms24.2 ms800 µs1.62 GiB34.3×OK
Pipitbytecode VM73.29 ms90.4 ms93.7 ms1.50 ms592 MiB1.00×OK
CPython 3.14bytecode VM7843 µs190 ms193 ms1.45 msn/a0.26×OK
PyPy 7.3tracing JIT7602 µs298 ms299 ms1.78 msn/a0.18×OK
tengobytecode VM0n/an/an/an/an/an/ano data
scriggobytecode VM0n/an/an/an/an/an/aunsupported
mvmbytecode VM7800 µs256 ms266 ms9.14 ms1.69 GiB0.24×OK
yaegiAST walker0n/an/an/an/an/an/ano data
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/pipit; 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. Pipit inherits Go's goroutine scheduler; CPython has to fork.

Source code