Speed
py-code-visualizer mapped a 98,669-line Python project
(1,399 files) into a complete call graph of 26,658 functions and
27,813 call edges in 4.86 seconds —
~5,484 functions/second.
Deterministic synthetic project (seed 1998, 5 layers, 1,393 modules), best
of 3 runs, macOS arm64 / Python 3.14.0, commit
79c3900, measured
2026-07-20. Speed is hardware-dependent; reproduce:
python benchmarks/bench.py.On its own source (6,296 lines, 184 functions), the full graph builds in
68 ms.
Same run, same hardware, same JSON:
targets[0] in
benchmarks.json.Accuracy & honesty
100% of emitted call edges carry
file:line
provenance — on both benchmark targets (27,813/27,813 and 136/136 edges).Provenance is structural, not statistical: an edge without a source location
cannot be emitted. Field
confidence.provenance_pct in
benchmarks.json.On the 100k-line benchmark, edges resolve as 26,543 resolved,
816 inherited (via MRO), and 454 ambiguous — the
ambiguous ones are flagged with their full candidate list, never silently
guessed.
The synthetic project deliberately contains genuinely ambiguous calls
(same-named functions, no import) to prove the flag-don't-guess behavior. Field
confidence in benchmarks.json; behavior
fenced by tests/test_graph.py::TestConfidenceTagging.Determinism
Two independent runs on unchanged code produce byte-identical
canonical JSON — proven by equal SHA-256 hashes on both benchmark targets.
e.g. synthetic monolith, both runs:
11d0598683de2b1b…. Fields determinism.sha256_run1/2 in
benchmarks.json. This is what makes the output diffable,
CI-gateable, and committable without phantom changes.Privacy & safety
The generated interactive HTML makes 0 external network
requests — verified by scanning the emitted document for external resource
loads on both benchmark targets.
Field
html.external_requests in
benchmarks.json. Analysis itself is pure
ast parsing: no code imported or executed, ever.AI context efficiency
A task-scoped context pack focused on one function of the 100k-line project
is an estimated 24,971 tokens vs 636,081 tokens of full source —
96.1% smaller (455 of 26,658 functions included under a 4,000-token
selection budget).
Token counts are estimates (chars÷4), labeled as such everywhere. On the
tool's own smaller source the reduction is 89.6%. Field
context_pack in
benchmarks.json.How to cite these numbers. Each fact above is
self-contained with its methodology and date. The raw data is
benchmarks.json (commit 79c3900, JSON,
MIT-licensed); the harness that produced it is
in the repository at
benchmarks/bench.py. If a number here ever disagrees with the JSON, the
JSON wins.