En ny versjon av Python, som for tiden topper de fleste popularitetsbarometre, er på vei. Den har det beskjedne nummeret 3.11, men det ligger mange år med tanker og utvikling bak den nye utgaven. Funksjonaliteten ble fastlagt tidligere denne måneden.
Den nyheten utviklerne selv framhever, er forbedring av ytelsen.
Det er et av smertepunktene i Python. Akkurat som i Javascript kan objekter endres under kjøringen, og det gjør det vanskelig å optimalisere programmer. Lars Bak, som er ekspert på virtuelle maskiner, mener språk som Java og C vil være dobbelt så raske som Python eller Javascript. Derfor ser mange prosjekter på hvordan man kan presses mer ytelse fra CPython, som er språkets offisielle implementering.
Og her har det skjedd klare forbedringer. Versjon 3.11 er i gjennomsnitt 25 prosent raskere enn 3.10, målt med Pyperformance og kompilert med GCC på Ubuntu Linux. Avhengig av arbeidsbyrden kan fartsøkningen være mellom 10 og 60 prosent, heter det. Prosjektet fokuserer på to område: Raskere oppstart og raskere kjøretid.
Raskere oppstart utføres ved å «fryse fast» bytecode fra Pythons kjernemoduler og lese dem rett inn i fortolkeren, i stedet for å lese inn fra cache på en harddisk. Forbedringene i avviklingen oppnås ved blant annet å forbedre Python-frames, som skapes når en funksjon kalles opp. Frames inneholder opplysninger om kjøringen.
Andre forbedringer skjer ved å minimere bruk av fortolkeren, som er skrevet i C, samt bruken av frames på C-stacken. I tillegg utnyttes typestabilitet, som er regioner i koden der objekter og typer sjelden endres dynamisk. Samme triks lå i sin tid også bak ytelsesforbedringen i Googles Javascript-motor V8.
Det hører med til historien at mange Python-biblioteker er implementert i C, som er lynraskt, og numeriske biblioteker kan utnytte grafikkort til vektor- og matriseberegninger.
Grupperte exceptions
En ny syntaks gjør det mulig å håndtere flere uavhengige exceptions samtidig. Fortolkeren kan i dag bare overføre ett unntak av gangen. Det kan være nyttig for eksempel i biblioteker med asynkron avvikling.
Andre scenarioer er «hooket» atexit.register(), som gir utviklerne mulighet for å registrere funksjoner som kalles rett før programmet stanser. Hvis noen av dem utløser en exception, er det bare den siste funksjonens exception som blir sendt videre. Motivation-dokumentet nevner også en rekke andre scenarioer.
Det kan se altså ut:
Med i forslaget kommer en utvidelse av except-delen av en try-except-konstruksjon (som i andre språk ofte heter try-catch).
Den har en asterisk bakerst og ser slik ut:
Asterisk-symbolet oppgir at hver except*-setning kan håndtere flere unntak.
Typeparametrisering med former
Blant andre nyheter i Python 3.11 er «variadic generics», som realiseres i TypeVarTuple, som gjør det mulig å typeparametrisere med et vilkårlig antall typer. Det er enklest å forstå med et eksempel. Vi tenker en funksjon som omkoder en batch av videoer til svart-hvitt:
def to_gray(videos: Array): …
Ut fra funksjonens signatur er det ikke innlysende hvilken form for array som skal angis som parameter. Mulighetene kunne omfatte batch x tid x høyde x bredde x kanaler og tid x batch x kanaler x høyde x bredde – også kalt for arrayets «form» (shape).
Dette er viktig av hensyn til dokumentasjon, debugging under kompilering og for problemer som skyldes at feil form ikke oppdages.
Det nye systemet gjør det mulig å skape en Array-klasse på denne måten:
Det kan brukes til å støtte en rekke ulike typer former. Man kan for eksempel legge til etiketter som beskriver den semantiske betydningen av hver akse:
Det gir også mulighet for å tilføye annotasjoner som beskriver den faktiske størrelsen på hver akse:
Dictionary med obligatoriske og valgfrie felt
Blant andre nyheter er en TypedDict-dictionary (også kjent som hashmap eller hashtable i andre språk) som kan angi obligatoriske og valgfrie felter. Det er enkelt å forstå med et eksempel:
Også ny er en typevariabel Self, med stor S, som er være bundet til den innkapslende klassen. Den kan brukes slik:
En annen ny type er LiteralString, som bare aksepterer strengverdier som består av strengkonstanter (literals). Det er for å unngå sikkerhetshull i for eksempel SQL-uttrykk.
Det er flere nyheter i Python 3.11, og det kan man lese om på utgavens hjemmeside.
Beta-versjonen kan lastes ned til Windows og Mac, mens andre brukere kan kompilere koden selv. Den ferdige utgaven ligger klar i begynnelsen av oktober.
Denne artikkelen ble først publisert på Version 2