# PyZeROS: a Python-first alternative to \`rclpy\` over Zenoh

**URL:** <https://discourse.openrobotics.org/t/pyzeros-a-python-first-alternative-to-rclpy-over-zenoh/56806>\
**Category:** ROS General\
**Tags:** release\
**Created:** [July 20, 2026, 7:03pm UTC](https://discourse.openrobotics.org/t/pyzeros-a-python-first-alternative-to-rclpy-over-zenoh/56806 "2026-07-20T19:03:08Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![2lian](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/2lian/32/32163_2.png) [@2lian](https://discourse.openrobotics.org/u/2lian)\
**Post date:** [July 23, 2026, 1:34am UTC](https://discourse.openrobotics.org/t/pyzeros-a-python-first-alternative-to-rclpy-over-zenoh/56806/6 "2026-07-23T01:34:45Z")

</div>

Got some early benchmarks on a strong desktop PC!

Empty String message:

- `pyzeros`: 12us
- `AsyncNode`: 10us

12 joints JointStates messages:

- `pyzeros`: 16us
- `AsyncNode`: 22us

Standard deviation is 4us for all

So basically, AsyncNode is slightly lighter, I guess because it’s just a callback, whereas `pyzeros` has a queue and backpressure system that adds a few more us. And maybe the zenoh-python bindings are a few us slower than the C RMW. Also AsyncNode might be better at handling empty messages, delegating to C, instead of pyzeros that has to create empty python objects and allocate memory.

On non-empty messages, my XCDR1 codec `cydr` – that is very optimised for Python – makes `pyzeros` take the lead. But I doubt 8us come from the codec alone, maybe I also do less memory operations than AsyncNode.

PS: the new AsyncNode is insanely fast, just like what I found by using `asyncio` on my own. Good job to the ROS team, 6x improvement, that’s fantastic.

---

_[View the full topic](https://discourse.openrobotics.org/t/pyzeros-a-python-first-alternative-to-rclpy-over-zenoh/56806)._
