Python - rychlost asynchroního kódu

Asynchroní zpracování vstupně-výstupních operací je poslední roky velký trend. Python od verze 3.4 obsahuje novou knihovnu asyncio a v nedávno vydané verzi 3.5 přibyla i podpora pro klíčová slova async a await, které můžete znát třeba z C#. V tomto článku bych se rád podíval na rychlost asynchroního kódu v Pythonu a srovnal ho s konkurencí (Go, Erlang, Node.JS).

Každého zajímají hlavně výsledky, tady jsou:

Ve všech případech jsem testoval jednoduchý HTTP server, který vrací pouze "Hello world!". Zdrojáky všech testů jsou dostupné na githubu. Z testů jsem vyřadil cython, nuitku a pypy3, protože nevykazovaly žádné převratné výsledky ve srovnání s pypy i pythonem.

Co můžeme vyčíst z výsledků:

  • Nová knihovna aiohttp používající novou async syntax na tom zatím výkonově moc dobře není, v testu dopadla nejhůře. Samotná knihovna asyncio, která je součástí Pythonu na tom není o mnoho lépe.
  • PyPy s knihovnou Trollius je srovnatelně rychlé či dokonce o trochu rychlejší než Node.JS.
  • Jako velmi rychlé se ukázalo Go se svojí standardní knihovnou net/http.
  • PyPy s knihovnou Tornado sice není výkonově úplně stabilní, ale v průměru se ukázalo jako dokonce rychlejší než Go.
  • Překvapivým vítězem testu se stalo PyPy v kombinaci s knihovnou Asyncore.

UPDATE

Do testu bylo přidáno několik nových kandidátů - Japronto, Meinheld, Sanic a kombinace uvloop+httptools. Zejména Japronto přináší velmi zajímavý výkon, přinejmenším srovnatelný s dosavadním vítězem testu Asyncore (s PyPy).

UPDATE 2

Doplněna Vibora.

Hodnocení

Komentáře

Komentáře již nelze přidávat