+− THE DAILY DIFFdev & AI news
SHIP IT

Python-prestasie: inheemse NumPy-lusse, terugroepe en omskakelingskoste

'n Beheerde SVE-alleen numeriese toets volg identiese waardes deur CPython-lusse, NumPy-rekenkunde, 'n Python-terugroepomhulsel en 'n saamgestelde Numba-lus.

Want to see our stories first on Google? Add us to your preferred sources — it helps us grow.

'n Beheerde SVE-alleen numeriese toets volg identiese waardes deur CPython-lusse, NumPy-rekenkunde, 'n Python-terugroepomhulsel en 'n saamgestelde Numba-lus. Klaar-insette NumPy het 'n groot voorsprong gehad, terwyl omskakeling van en terug na Python-lyste daardie voordeel tot 'n byna gelykop gereduseer het. Die episode verduidelik die uitvoergrens en hoe om die resultaat wat 'n toepassing benodig, te meet.

Lees die geskrewe uitgawe (Engels) ↗

Wat hierdie video dek

  • CPython stel bron saam na bytode. Herhaalde tolk-/objekwerk en 'n getikte inheemse numeriese lus is verskillende uitvoerreëlings.
  • Numeriese NumPy-rekenkunde kan getikte groepe aan saamgestelde bewerkings gee; die rekenkundige lus bestaan steeds, en aansigte kan nie-aaneenlopende uitlegte hê.
  • Meet omskakeling en vereiste uitvoerrepresentasie. In hierdie lopie het die omskakeling van Python-lyste in skikkings en terug die groot klaar-skikking-voorsprong uitgewis.
  • Klein werkladings kan gewone Python bevoordeel omdat vaste skikking-oproepkoste saak maak. Die agt-waarde-begrip het hierdie gemete vergelyking gewen.
  • np.vectorize is 'n geriefsomhulsel wat Python vir opeenvolgende elemente aanroep; 'n groepsinterface alleen vestig nie inheemse numeriese uitvoering nie.
  • Saamgestelde Python-sintaksis-lusse kan ook vinnig wees. Sluit koue samestellings-/opstellingskoste in wanneer dit vir die oproeper saak maak.
  • Inheemse uitvoering, SVE SIMD, multithreading en GVE-agterkant is afsonderlike idees. Beskikbare SVE-kenmerke spoor nie die instruksies wat in 'n spesifieke lopie gebruik word nie.

Vertaalde transkripsie

Vertaal uit die oorspronklike Engelse vertelling. Beskikbare klank en onderskrifte word deur YouTube beheer.

Hoekom kan dieselfde SVE vroeër kla?

0:00 Jy dink Python het 'n nuwe taal nodig om vinnig te word. Dieselfde SVE het ons bondel vinniger laat loop nadat die lus geskuif is. Waarheen het die werk gegaan? Wanneer verdwyn die spoedverhoging? Watter kortpad bring Python terug? Dit is The Daily Diff, onder die enjinkap. Hou daardie kortpad dop. CPython is die standaard Python-implementering.

0:17 Dit stel jou bron saam in bytode, en voer dan daardie instruksies in 'n tolk uit. NumPy is 'n numeriese biblioteek waarvan die skikkings waardes met 'n verklaarde datatipe bevat. Die ingeboude rekenkunde kan 'n hele bondel aan saamgestelde bewerkings gee. Neem 'n miljoen dryfgetalwaardes, kwadreer elkeen, en tel dan die oorspronklike waarde by. Elke weergawe kry identiese waardes en lewer ooreenstemmende antwoorde. Die waardes is klein genoeg om afrondingsverskille uit die wedloop te hou.

0:40 Op hierdie masjien het die begrip ongeveer drie-en-dertig millisekondes geneem. NumPy het minder as een geneem. Albei het op die SVE geloop. Dit is nuttige bewyse vir hierdie werklading, en 'n verskriklike doodsberig vir 'n programmeertaal. Begin met die gewone lus.

Watter werk herhaal 'n Python-lus?

0:53 Python kry die volgende waarde, voer die rekenkunde uit, en voeg die antwoord by. Dan doen dit dit weer. Die vermenigvuldiging is goedkoop. Die reëling van die volgende vermenigvuldiging, en die hantering van die Python-objekte daar rondom, voeg elke keer werk by. Dit is die werklike dekompilering van die getoetsde funksie. Iterasie, vermenigvuldiging en optelling verskyn as bytode-instruksies. Python-weergawes en -tolke maak verskillende keuses.

1:14 Hierdie tydsberekeninge behoort aan die weergawe op die skerm, wat Python drie punt tien is. 'n Python-lys stoor verwysings na objekte, sodat verskillende soorte dinge 'n lys kan deel. Ons rekenkundige taak gebruik deurgaans getalle. Dit betaal vir 'n algemene reëling terwyl dit 'n herhalende diens aanvra. Stel jou voor jy bestel 'n miljoen keer dieselfde koffie en vul 'n nuwe vorm vir elke koppie in. Die koffiemasjien is in orde.

1:36 Die papierwerk het sy eie loopbaan ontwikkel.

Waar skuif NumPy die lus heen?

1:38 NumPy verander die kontrak. Hierdie skikking bevat dryfgetalwaardes van vaste grootte met een verklaarde tipe. Ons skikking is aaneenlopend, sodat sy waardes saam in die geheue sit. Aansigte kan ander uitlegte hê. Die rekenkundige bewerking weet watter soort data dit ontvang. Die oproep gee die bondel oor aan 'n inheemse bewerking. 'n Lus besoek steeds die waardes binne saamgestelde kode. Dit kan kennis van die tipe oor daardie werk hergebruik.

2:00 Python bly die persoon wat die werk oorhandig. Itamar Turner Trauring verduidelik die onderskeid in Python Speed. Bondel-koppelvlakke, inheemse implementering en verwerker-vektorinstruksies is afsonderlike dinge. Die funksienaam lewer baie min bewyse.

Beteken vinnig GVE of baie SVE-kerne?

2:13 Hierdie resultaat het NumPy op die SVE gebruik. 'n GVE-agterkant soos CuPy kies 'n ander tuiste vir skikkings en bewerkings. 'n GVE te koop laat hierdie gewone Python-lus loop waar dit reeds geloop het. SVE-vektorinstruksies kan verskeie waardes saam verwerk. NumPy het meganismes om ondersteunde kerne te kies. Ons looptyd rapporteer beskikbare kenmerke, maar spoor nie hierdie uitdrukking se instruksies na nie. Om die hele gemete wins aan vektorinstruksies toe te skryf, sal die bewyse oorskry.

2:40 Die GVE-inkopiemandjie kan toe bly. Daar is iets diep bevredigend aan 'n prestasie-oplossing wat ook 'n aankoop kanselleer. Ongelukkig gaan die maatstaf voort.

Wanneer verdwyn die indrukwekkende spoedverhoging?

2:49 Met agt waardes het die begrip gewen. Die oproep van die skikkingmeganisme het meer gekos as die klein taak. Groter klaargelegde skikkings het voorgeloop. Ons het herhaalde proewe en 'n opgewarmde proses gebruik. Nuwer Python-bouwerk kan die oorgang verander. Verander dan wat die toepassing benodig. Begin met 'n Python-lys en eindig met 'n vars Python-lys. NumPy moet die inset in 'n skikking omskakel en die antwoord terug in Python-

3:11 objekte omskakel. Daardie stappe behoort op die rekening as jou toepassing dit benodig. Teen 'n miljoen waardes het daardie volledige pad ongeveer agt-en-twintig millisekondes geneem. Die begrip het ook ongeveer agt-en-twintig geneem. Ons dramatiese voorsprong het 'n byna gelykop geword. Die vinnige deel was eg. Die voordeel het afgehang daarvan om die data in sy numeriese vorm te laat bly.

Watter grense hoort in die maatstaf?

3:28 Volg die data. As die volgende bewerking 'n skikking aanvaar, behou die skikking. As jy herhaaldelik tussen lyste en skikkings omskakel, meet daardie kruisings. Om te stop voor 'n duur oorhandiging, gee akkurate syfers vir die verkeerde vraag. Die vermenigvuldiging van hierdie skikking skep 'n tydelike resultaat. Die optelling van die oorspronklike waardes skep die uitset. Inheemse uitvoering benodig steeds geheue en skuif data.

3:47 Sommige bewerkings aanvaar 'n uitvoerbuffer, wat toekennings verminder wanneer jou kode dit veilig kan hergebruik. Een mooi lyn kan verskeie groot buffers bestel. Python Speed wys ook hierdie probleem uit. Die toewyser is merkwaardig onverskillig oor jou estetika.

Kan 'n saamgestelde Python-lus ook vinnig wees?

4:00 Jy kan ook lus-sintaksis behou en die uitvoering daarvan verander. Numba kan ondersteunde numeriese Python-funksies na inheemse kode saamstel. Hier is die lus van ons toets met sy samesteller-dekorator. Dit sê nog steeds 'for'. Die duur tolkpad het verander. Na samestelling het hierdie lus minder as 'n halwe millisekonde geneem met klaar- skikkings. Die samestelling self het ongeveer 'n sekonde geneem in hierdie lopie. Daardie opstellingskoste is uitgesluit van die herhaalde tydsberekeninge,

4:22 so 'n klein eenmalige taak verdien 'n ander vergelyking. Numba se eie gids wys graag eksplisiete lusse. 'n Taalmigrasie begin voordat die warm pad gevind word, is 'n ingewikkelde manier om 'n profiler te vermy. Vind eers wat die tyd verbruik. Netwerk-wagte, objekontleding en grootskaalse rekenkunde vra vir verskillende oplossings. Inheemse skikkingbewerkings help wanneer die berekening en data pas.

4:43 Meet die resultaat wat jou oproeper werklik benodig. Nou vir daardie kortpad. Jy het 'n Python-funksie en wil hê dit moet 'n skikking aanvaar. 'n Omhulsel genaamd vectorize klink soos die ontbrekende prestasie-knoppie. Die dokumentasie daarvan het 'n belangrike sin wat wag.

Wat voer np.vectorize eintlik uit?

4:56 NumPy sê sy vectorize-omhulsel word hoofsaaklik vir gerief verskaf. Die implementering daarvan is in wese 'n for-lus. Die omhulsel aanvaar groepe, maar hou aan om jou Python-funksie vir opeenvolgende elemente te roep. Die koppelvlak het korter geword. Die uitvoergrens het besig gebly. Kyk hoe dieselfde waardes terugkom deur die Python-terugroep. Met klaargelegde skikkings het hierdie weergawe ongeveer sewe-en-tagtig millisekondes geneem. Dit was stadiger as ons begrip.

5:18 'n Nuttige uitsaai-omhulsel kan die presiese per-element werk behou wat jy probeer het om te verwyder. Kontroleer die implementering agter 'n bondel-koppelvlak, hou versoenbare data in sy nuttige vorm, en sluit omskakeling in die vergelyking in. Inheemse, terugroep- en saamgestelde lusse kan soortgelyk lyk vanuit die oproeper se stoel. Die naam 'vectorize' het 'n belofte gemaak wat jou stophorlosie nooit onderteken het nie. Behou dit wanneer gerief is wat jy benodig. Vir prestasie, kontroleer die lus wat loop.

Wat moet jy in jou kode verander?

5:41 My uitspraak is 'ship it' vir die bondel van 'n gemete numeriese 'hot path'. Behou gewone lusse wanneer hulle reeds goed werk. Kontroleer waar die werk plaasvind en wat die volgende oproeper benodig. Teken in, druk die klokkie, en vertel my in die kommentaar of jy dit anders sou gestempel het. En dit is die 'diff' vir vandag. Ek is Niko van Axrisi. Voeg verantwoordelik saam.

Bronne

  1. Universal functions (ufunc) basics — NumPy 2.2NumPy
  2. The N-dimensional array — NumPy 2.2NumPy
  3. numpy.vectorize — convenience and performance notesNumPy
  4. CPU/SIMD optimizations — NumPy 2.2NumPy
  5. dis — Disassembler for Python bytecodePython Software Foundation
  6. CPython 3.10.12 list representationCPython contributors
  7. The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
  8. Performance TipsNumba
  9. Basics of CuPyCuPy

Verwante video's