A CPython egy új, úgynevezett tail-calling (visszahívás-optimalizáló) interpretert kaphat, amely jelentősen javíthatja a teljesítményt a megfelelő fordítóprogramok esetén. Az ötlet nem új, korábban más rendszerekben, például a Protobuf és a Lua (Deegen) interpretációs környezetében is alkalmazták.
Tartalomjegyzék

A jelenlegi CPython értelmezők és az új módszer helye
Jelenleg a CPython három különböző értelmezőt használ: a switch-case alapú megoldást (MSVC), a computed goto módszert (Clang, GCC) és az úgynevezett uop értelmezőt, amely minden platformon működik. Az új tail-calling értelmező ezektől párhuzamosan működne, így nem merül fel kompatibilitási probléma.
Jelentős teljesítményjavulás
A teljesítménytesztek kiemelkedő eredményeket mutatnak: az új interpretációs mód körülbelül 10%-os átlagos gyorsulást eredményez a pyperformance tesztjein, míg Python-intenzív méréseknél akár 40%-os gyorsulás is elérhető. A teszteket Clang-19-cel, ThinLTO és PGO optimalizációval futtatták AMD64 architektúrájú Ubuntu 22.04 rendszeren. Az eredmények jelentőségét mutatja, hogy egy 10%-os teljesítményjavulás nagyjából két kisebb CPython kiadás teljesítménynövekedésével egyenértékű.
Kihívások és megoldások
Az új megközelítés fenntartása és hordozhatósága azonban kihívást jelenthet. A fejlesztő, Fidget-Spinner szerint a CPython 3.12-ben bevezetett értelmező-generátorral a karbantarthatóság biztosítható, mivel az automatikusan előállítja a szükséges infrastruktúrát. A generátor várhatóan mindössze 200 soros Python kód lesz, amely nagyrészt meglévő mechanizmusokra épül.
A hordozhatóság szempontjából jelenleg Clang-19 támogatja az új értelmezőt AArch64 és AMD64 architektúrákon, míg Clang-18 és a GCC jövőbeli verziói részleges támogatást kínálhatnak. A GCC egyelőre nem rendelkezik minden szükséges optimalizációval, de a múltbeli példák alapján valószínű, hogy idővel követni fogja a fejlesztéseket.
Bevezetési terv és további lépések
A bevezetés fokozatosan történne. Első lépésként a _PyEval_EvalFrameDefault módosítása és a DEOPT_IF/EXIT_IF optimalizációja történne meg, majd a Windows build scriptbe és az –enable-optimizations beállításba is bekerülne az új értelmező.
A CPython közösség egyes tagjai aggodalmukat fejezték ki az esetleges új hibák miatt, azonban a fejlesztő szerint az interpretációs generátor közös kódot használ a meglévő megoldásokkal, így az esetleges hibák a jelenlegi interpretert is érintenék. Emellett a musttail és preserve_none attribútumokat már évek óta használják más rendszerekben, így a fordítóprogramok oldaláról is megbízható a támogatás.
Ha az új tail-calling értelmező elfogadásra kerül, a teljesítménye akár a jelenlegi JIT fordítót is felülmúlhatja, jelentős gyorsulást biztosítva a CPython számára.
További részletek a cpython Github oldalán található jegyben olvashatóak.