pymizu beschleunigt Python-Aufgaben um das 135-Fache – über Shared Memory statt Sockets
Mizu – zero-copy parallel R and Python over shared memory
pymizu schickt Aufgaben nicht mehr über Sockets, sondern über POSIX-Shared-Memory, wodurch ein Roundtrip von rund 100 µs auf unter 1 µs fällt. Listen, dicts, numpy-Arrays und Arrow-Tabellen wandern als Zero-Copy-Views zwischen Python und R. Der Executor ist ein Drop-in für concurrent.futures, inklusive asyncio-Anbindung und reproduzierbarer Zufallszahlen. Gegenüber ProcessPoolExecutor meldet das Projekt bis zu 135-fache Beschleunigung. Die API gilt noch als experimentell.
Ein Task-Roundtrip sinkt von rund 100 µs über Sockets auf unter 1 µs – Arbeit lässt sich also so fein aufteilen wie mit Threads.
- stdbrouw
Beeindruckend. Ich erinnere mich, dass ich letztes Jahr ziemlich enttäuscht von mirai war, als ich erfuhr, dass es keinen gemeinsamen Zugriff auf eine In-Memory-Arrow-Tabelle bieten konnte. Multicore-Verarbeitung in R ist großartig, wenn sie funktioniert, aber zu oft ist es nur eine Frage der Zeit, bis unerwünschte und unnötige Datenkopien die Performance komplett zerstören.
- shikokuchuo
Hier der Autor: Ich habe mizu (R) und pymizu (Python) geschrieben, Pakete, die lock-freies asynchrones und paralleles Rechnen über Shared Memory bieten, aufgebaut auf demselben C-Kern, libmizu. Der obige Link führt zum Python-Paket.
Ein Task-Roundtrip sinkt auf unter eine Mikrosekunde, von etwa 100 µs über Sockets mit Pythons ProcessPoolExecutor oder mirai, meinem anderen R-Framework. Das sind Zahlen von meinem Laptop (einem M4 Pro), und die Benchmark-Skripte liegen in den Repos, damit du sie selbst ausführen kannst.
Die Worker holen sich Tasks aus lock-freien Queues, es gibt keinen Task-Dispatcher, und auf dem Hot Path werden Systemaufrufe vermieden.
`PoolExecutor` ist ein Drop-in-`concurrent.futures.Executor`, Tasks sind in asyncio awaitbar, NumPy-Arrays sowie polars-, pyarrow- und pandas-Frames werden als Zero-Copy-Views übergeben. Da mizu und pymizu dasselbe Wire-Format teilen, werden Data Frames und Arrow-Typen auch zwischen Worker-Pools verschiedener Sprachen zero-copy übertragen.
Natürlich funktioniert das nur auf einer einzigen Maschine, da es Shared Memory verwendet. Die API ist noch experimentell. Feedback zur Benutzbarkeit und Bug-Reports sind in den Repos sehr willkommen. Ich würde gerne hören, wo du das gerne einsetzen würdest.
Write-up mit vollständigen Benchmarks und den R/Python-Codebeispielen: https://opensource.posit.co/blog/2026-11-05_mizu-0-1-0/