DeepMind, et selskap kjent for sitt arbeid innen kunstig intelligens, har gjort S6-prosjektet åpent kildekode, som utviklet en JIT-kompilator for Python. Prosjektet er kjent for sitt design som et utvidelsesbibliotek som integreres med den innebygde CPython, noe som sikrer full kompatibilitet med CPython og ikke krever noen endringer i tolkekoden. Prosjektet har vært under utvikling siden 2019, men dessverre ble det avviklet og utvikles ikke lenger. Siden arbeidet som ble laget kunne være nyttig for å forbedre Python, ble det besluttet å gjøre det åpent kildekode. JIT-kompilatorkoden er skrevet i C++, basert på CPython 3.7, og er lisensiert under Apache 2.0-lisensen.
Når det gjelder oppgavene den løser, sammenlignes S6 for Python med V8-motoren for JavaScript. Biblioteket erstatter den eksisterende ceval.c bytecode-tolkerhåndtereren med sin egen implementering, som bruker just-in-time (JIT)-kompilering for å øke hastigheten på kjøringen. S6 sjekker om den gjeldende funksjonen allerede er kompilert, og i så fall kjører den den kompilerte koden. Hvis ikke, kjører den funksjonen i bytecode-tolkningsmodus, på samme måte som CPython-tolkeren. Under tolkningen telles antallet utførte instruksjoner og kall knyttet til funksjonen som behandles. Etter å ha nådd en viss terskel, startes kompileringsprosessen for å øke hastigheten på ofte utført kode. Kompilering skjer til strongjit-mellomrepresentasjonen, som etter optimalisering konverteres til native maskininstruksjoner for målsystemet ved hjelp av asmjit-biblioteket.
Avhengig av arbeidsmengden viser S6, under optimale forhold, opptil 9.5 ganger raskere benchmark-utførelse enn standard CPython. Å kjøre 100 iterasjoner av Richards-benchmarkpakken resulterer i en 7x hastighetsøkning, mens å kjøre Raytrace-benchmarken, som involverer omfattende matematiske beregninger, resulterer i en 3–4.5x hastighetsøkning.
Oppgaver som er vanskelige å optimalisere med S6 inkluderer prosjekter som bruker C API, for eksempel NumPy, og operasjoner som krever typekontroll av et stort antall verdier. Lav ytelse observeres også for enkeltkall av ressurskrevende funksjoner på grunn av S6s bruk av en proprietær, uoptimalisert Python-tolk (utviklingen har ennå ikke nådd stadiet med å optimalisere den tolkede modusen). For eksempel, i Unpack Sequence-testen, som pakker ut store sett med arrayer/tupler, bremses et enkeltkall opptil 5 ganger, mens et syklisk kall resulterer i ytelse som er 0.97 ganger tregere enn CPython.
Kilde: opennet.ru
