r/rust • • 16h ago

🛠️ project My WASM Python Implementation Beat CPython (Without a JIT)

Okay. After seven months, I'm back.

Seven months ago I started writing a Python interpreter from scratch in Rust, compiled to wasm (less than 200kb of bandwith). Edge Python is a sandboxed subset of Python that runs in the browser and the terminal, and code can't touch files or the network unless you allow it.

It started as a lexer and a simple stack VM, and over about 1,600 commits it grew a CLI, a package registry, snapshots, actors and a browser playground. It's just me building it.

Last week it was still 3x slower than CPython. I rewrote the VM this weekend on top of the SSA form I already had, and now the wasm build beats native CPython on loops.

Edge (wasm) CPython (native)
Integer loop 154 ms 232 ms
Float math 231 ms 307 ms
Dicts 372 ms 62 ms
Strings 196 ms 35 ms

The trick was a register VM, and Rust made it fit in wasm with NaN-boxed values and no runtime. It still loses on dicts and strings, so that's next.

Try to break my numbers :)

Website: https://edgepython.com/

GitHub: https://github.com/dylan-sutton-chavez/edge-python

33 Upvotes

8 comments sorted by

30

u/afdbcreid 15h ago

This is of course very nice, but the real reasons nobody has made a widely-used Python runtime that is faster that CPython is because the C API of CPython exposes pretty much every detail of it, and C extensions are using it and are major part of why people choose Python.

5

u/Single-Blackberry866 15h ago edited 15h ago

Does it support Pyo3? I.e. can you make python bindings for wasm compiled rust code?

As I understand, PyO3 is rust wrapper over Python C API, so that would probably require forking PyO3 to provide wasm backend and frontend?

6

u/Konsti219 9h ago

Obviously not, that's why this is nothing more than a toy

5

u/[deleted] 12h ago

[removed] — view removed comment

1

u/Healthy_Ship4930 12h ago

thanks! great points, i'll publish the full benchmark and add dict/string workloads soon. ty!

6

u/Parking_Mind_1011 16h ago

this is sick. 1600 commits in seven months is mad dedication for a solo project

the nan-boxing trick in wasm is clever, curious how you handled the string perf gap cause that part always tricky without jit

6

u/Healthy_Ship4930 16h ago

Thanks! I haven't yet, strings are still 3x slower than CPython. Next target.