Een nieuwe uitvoering van Python

PyPy 8.0.0 is op 19 september verschenen, met voor het eerst ondersteuning voor Python 3.12. Die uitvoering heet nog bèta. Voor wie zelf programmeert, draait de interessante vraag om de aansluiting op bestaande softwarepakketten.

Dezelfde taal, een andere motor

Python is de programmeertaal; een interpreter voert je programma uit. PyPy is een alternatief voor CPython, de gebruikelijke uitvoering. Het heeft een just-in-timecompiler, kortweg JIT, die tijdens het draaien code optimaliseert. Volgens de projectdocumentatie komt dat vooral tot zijn recht bij langer draaiende programma’s waarin veel tijd naar Python-code gaat. Een klein script dat meteen weer stopt, geeft de compiler weinig tijd om op gang te komen. En als het werk voornamelijk in al gecompileerde bibliotheken gebeurt, helpt die JIT daar niet bij. Voor een student die een simulatie schrijft kan de afweging daardoor anders uitvallen dan voor iemand die een kort bestandje omzet. Een andere interpreter is geen algemene snelheidsknop.

Waarom een pakket moet passen

Je eigen Python-code is vaak maar een deel van het programma. Extra pakketten kunnen vooraf gecompileerde onderdelen bevatten. Een wheel is een pakketformaat waarin zulke onderdelen worden verspreid. De officiële verpakkingsspecificatie beschrijft drie labels: de Python-uitvoering, de binaire interface en het platform. Samen helpen ze een installatieprogramma bepalen welke download geschikt is. Het verschil tussen CPython en PyPy telt dus mee, net als het besturingssysteem en de processorarchitectuur. De vermelding van een Python-versie alleen maakt twee downloads nog niet uitwisselbaar. Dat verklaart waarom een pakket op de ene omgeving direct installeert, terwijl een andere omgeving een passende bouwversie nodig heeft. Het gaat om de aansluiting tussen onderdelen, niet alleen om de taal waarin je eigen script is geschreven.

Een stabiele aansluiting heeft grenzen

Python biedt daarvoor de Limited API: een afgesproken deel van de functies waarmee uitbreidingen op Python aansluiten. De bijbehorende Stable ABI legt de binaire aansluiting vast. Daardoor kunnen geschikte uitbreidingen voor meerdere Python-versies bruikbaar blijven zonder telkens opnieuw te worden gebouwd. Dat vraagt wel dat de maker zich aan die beperkte interface houdt. De Python-documentatie waarschuwt dat een compilatie-instelling op zichzelf geen volledige garantie geeft. Ook het gedrag van gebruikte functies en andere platformvoorwaarden blijven belangrijk. De naam stabiel betekent evenmin dat elk pakket dezelfde prestaties behoudt: sommige snelle, versiespecifieke ingrepen zijn binnen deze aanpak niet beschikbaar. Voor pakketmakers is het dus een afweging tussen brede inzetbaarheid en toegang tot details van één uitvoering.

De ontbrekende schakels

PyPy 8 past zijn interne objectaansluiting aan voor toekomstige ondersteuning van cp312-abi3-pakketten, gemaakt voor de beperkte interface van CPython 3.12 en later. Dat is nog geen voltooide compatibiliteit. Volgens de release-uitleg moet de importfunctie zulke bibliotheken nog accepteren; ook pip en uv moeten ze als geschikte installatiekandidaten herkennen. Reken daarom nog niet op probleemloze installatie van die bestaande pakketten.

Linux krijgt een andere ondergrens

Bij de overstap hoort ook een systeemcontrole. PyPy kondigde in juli al aan dat zijn Linux-bouwomgeving naar glibc 2.28 zou gaan, met versie 8 als volgende grote release. Glibc is een basisbibliotheek waarop veel Linux-programma’s steunen. Die ondergrens bepaalt of de aangeboden programmabestanden bij je systeem passen. Op een oude server of een lesomgeving die lang niet is vernieuwd, kan daarom meer nodig zijn dan de Python-map vervangen. Die eis geldt nu voor de officiële Linux-bestanden. Controleer de systeemversie van de omgeving waarin je werkelijk draait; die hoeft niet gelijk te zijn aan die van je eigen laptop. Het verhogen van het versienummer vertelt op zichzelf niet of jouw bestaande installatie geschikt is.

Controleer ook wat je programma doet

Zelfs zonder extra pakketten kan gedrag verschillen. PyPy gebruikt een andere strategie om ongebruikte objecten op te ruimen dan CPython. De documentatie noemt bestanden en netwerkverbindingen als zichtbaar voorbeeld: ze hoeven niet onmiddellijk te sluiten zodra je programma er geen verwijzing meer naar heeft. Vertrouwt code toevallig op dat snelle opruimen, dan kan een overstap dat aan het licht brengen. Bij bestanden kan geschreven informatie bijvoorbeeld nog in een buffer staan. De oplossing begint bij bewust afsluiten van de gebruikte middelen, niet bij aannemen dat iedere interpreter hetzelfde opruimmoment heeft. Wie een schoolopdracht of hobbyproject overzet, doet er daarom goed aan behalve de uitkomst ook foutafhandeling en afsluiten van bestanden te controleren.

Probeer het naast je huidige omgeving

De installatiehandleiding beschrijft dat een gedownloade PyPy in een eigen uitgepakte map kan draaien. Je hoeft daarvoor niet meteen je bestaande Python te vervangen. Ze beschrijft ook een afzonderlijke virtualenv met de gekozen PyPy-interpreter. Daarin installeer je de extra pakketten voor dat project. Zo kun je nagaan welke afhankelijkheden beschikbaar zijn en of je programma ermee werkt. Let daarbij op oude voorbeelden in documentatie: een genoemd versienummer is niet automatisch de nieuwste uitgave. Gebruik de actuele downloadlijst om de juiste variant voor je systeem te kiezen. Voor een groepsopdracht is het bovendien handig vast te leggen welke interpreter en pakketten je gebruikt, zodat een klasgenoot dezelfde proef kan herhalen.

Meet je eigen werk

Maak de vergelijking vervolgens concreet. PyPy’s prestatiehandleiding adviseert eerst tests voor correct gedrag en daarna metingen: zoek uit waar een programma tijd verliest voordat je gaat optimaliseren. Wachten op een netwerkverbinding of op bestanden is een ander knelpunt dan veel rekenwerk. Een profiler helpt die plekken zichtbaar te maken. Draai voor een vergelijking dezelfde taak met dezelfde invoer, en controleer of de resultaten gelijk blijven. Daarmee krijg je een antwoord dat bij jouw programma hoort. Dit artikel bevat geen eigen snelheidstest van de nieuwe release. Voor jonge makers in Nederland en België is de bruikbare vervolgstap dus een afgebakende proef naast hun huidige omgeving: werken de pakketten, klopt de uitkomst en verdwijnt het gemeten knelpunt?

Verder bij de bron

Lees zelf de onderzoeken, uitleg en aankondigingen achter dit verhaal.

Bronnen en werkwijze