AI & Analytics

3 Numba-tips voor optimalisatie van Python-runtime

KDnuggets
3 Numba-tips voor optimalisatie van Python-runtime

Samenvatting

Numba 0.67.0 compileert Python-lussen naar machinecode, maar prestaties hangen vooral af van hoe vaak je de gecompileerde codegrens passeert.

Wat Numba 0.67.0 doet

Numba compileert numerieke Python-lussen naar machinecode zonder dat je de code naar C hoeft om te schrijven of elk onderdeel hoeft te vectoriseren. Het artikel werkt drie optimalisatietrucs uit rond één probleem: de grens tussen gewone Python en gecompileerde code.

De eerste truc gebruikt de decorateur `@njit` voor een lus die een NumPy-array met tien miljoen elementen doorloopt. Zonder decorateur verwerkt de Python-interpreter de typen bij ieder element. Met `@njit` leest Numba de typen bij de eerste aanroep, maakt een specialisatie en voert volgende aanroepen uit als native code.

De eerste aanroep bevat daardoor ook de compilatietijd. In het voorbeeld duurde die 0,2799 seconde. De meting vergelijkt daarnaast een gewone Python-lus, `@njit` en een NumPy-vectorisatie. De code controleert ook of alle methoden hetzelfde resultaat opleveren.

Waarom Numba relevant is voor Python-analytics

De winst zit niet automatisch in het toevoegen van een decorateur. Een kleine lus die vaak tussen Python en gecompileerde code wisselt, kan de voordelen van Numba tenietdoen. De drie trucs benaderen daarom dezelfde ontwerpvraag: hoe zorg je dat Numba voldoende werk in één gecompileerde passage uitvoert?

Dat onderscheid helpt bij de keuze tussen Numba en NumPy-vectorisatie. NumPy blijft geschikt wanneer een berekening zich goed laat uitdrukken met bestaande vectorbewerkingen. Numba past juist bij numerieke lussen die lastig te vectoriseren zijn, zolang de lusgrens goed ligt.

De voorbeelden zijn gecontroleerd met Numba 0.67.0. De meetopzet scheidt compilatietijd van herhaalde uitvoeringen, zodat je de eerste aanroep niet verwart met de prestaties daarna.

Numba: concrete takeaway

Meet bij Numba altijd afzonderlijk de eerste aanroep en de vervolgaanroepen. Houd de gecompileerde lus breed, vermijd onnodige terugkeer naar Python en vergelijk de uitkomst met NumPy-vectorisatie voordat je een implementatie kiest.

Lees het volledige artikel
Meer over AI & Analytics →