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.
  1. 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.

  2. 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/

Mehr von diesem Tag

2026-11-08