+− THE DAILY DIFFdev & AI news
SHIP IT

Python errendimendua: jatorrizko NumPy begiztak, callbackak eta bihurketa kostuak

PUZ bakarreko zenbakizko proba kontrolatu batek balio berdinak jarraitzen ditu CPython begiztatan, NumPy aritmetikan, Python callback wrapper batean eta Numba begizta konpilatu batean zehar.

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

PUZ bakarreko zenbakizko proba kontrolatu batek balio berdinak jarraitzen ditu CPython begiztatan, NumPy aritmetikan, Python callback wrapper batean eta Numba begizta konpilatu batean zehar. Prest dagoen NumPy sarrerak abantaila handia zuen, Python zerrendetatik bihurtzeak eta bueltan bihurtzeak abantaila hori ia berdinketara murriztu zuen. Atal honetan exekuzio muga eta aplikazio batek behar duen emaitza nola neurtu azaltzen da.

Irakurri idatzizko edizioa (ingelesez) ↗

Bideo honek zer jorratzen duen

  • CPython-ek iturburua bytecode-ra konpilatzen du. Errepikatutako interpretatzaile/objektu lana eta idatzitako begizta numeriko natibo bat exekuzio-antolaketa desberdinak dira.
  • NumPy aritmetika numerikoak idatzitako loteak eragiketa konpilatuetara pasa ditzake; aritmetika-begizta oraindik existitzen da, eta bistaratzeek egitura ez-jarraiak izan ditzakete.
  • Neurtu bihurketa eta beharrezko irteera-irudikapena. Exekuzio honetan, Python zerrendak array bihurtzeak eta atzera bueltan bihurtzeak prest dagoen array-aren abantaila handia ezabatu zuen.
  • Lan karga txikiek Python arrunta faboratu dezakete, array-deien kostu finkoak garrantzitsuak direlako. Zortzi balio zituen konprehensioak irabazi zuen neurtutako konparaketa hau.
  • np.vectorize erosotasunerako wrapper bat da, Python deitzen duena hurrenez hurreneko elementuetarako; lote-interfaze batek bakarrik ez du exekuzio numeriko natiboa ezartzen.
  • Python sintaxiko begizta konpilatuak ere azkarrak izan daitezke. Sartu konpilazio hotza/konfigurazio kostuak deitzailearentzat garrantzitsuak direnean.
  • Exekuzio natiboa, CPU SIMD, hari aniztasuna eta GPU backend-ak ideia bereiziak dira. Eskuragarri dauden PUZ funtzioek ez dituzte exekuzio jakin batean erabilitako instrukzioak trazatzen.

Itzulitako transkripzioa

Jatorrizko ingelesezko narraziotik itzulia. Eskuragarri dauden audioa eta azpitituluak YouTube-k kontrolatzen ditu.

Zergatik amaitu dezake PUZ berak lehenago?

0:00 Uste duzu Python-ek hizkuntza berri bat behar duela azkarra izateko. PUZ berak gure lotea azkarrago exekutatu zuen begizta mugitu ondoren. Nora joan zen lana? Noiz desagertzen da abiadura-hobekuntza? Zein lasterbidek dakar Python atzera? Hau The Daily Diff da, azpikoari begira. Begiratu lasterbide horri. CPython Python inplementazio estandarra da.

0:17 Zure iturburua bytecode-ra konpilatzen du, eta gero instrukzio horiek exekutatzen ditu interprete batean. NumPy zenbakizko liburutegi bat da, zeinaren array-ek balioak gordetzen dituzten adierazitako datu-motarekin. Bere aritmetika integratuak lote oso bat pasa diezaieke eragiketa konpilatuei. Hartu milioi bat puntu flotatzaileko balio, karratua egin bakoitzari, gero gehitu jatorrizko balioa. Bertsio guztiek balio berdinak lortzen dituzte eta erantzun berdinak ematen dituzte. Balioak nahikoa txikiak dira biribiltze-desberdintasunak lasterketatik kanpo mantentzeko.

0:40 Makina honetan, konprehensioak hogeita hamahiru milisegundo inguru iraun zuen. NumPyk bat baino gutxiago. Biak PUZan exekutatu ziren. Lan karga honetarako froga baliagarria da, eta programazio-lengoaia baten obituario txarra. Hasi begizta arruntarekin.

Zer lan errepikatzen du Python begizta batek?

0:53 Python-ek hurrengo balioa lortzen du, aritmetika egiten du eta erantzuna gehitzen du. Gero berriro egiten du. Biderketa merkea da. Hurrengo biderketa antolatzeak, eta inguruko Python objektuak kudeatzeak, lan gehigarria gehitzen du aldi bakoitzean. Hau probatutako funtzioaren benetako desmuntaketa da. Iterazioa, biderketa eta batuketa bytecode instrukzio gisa agertzen dira. Python bertsioek eta interpretatzaileek aukera desberdinak egiten dituzte.

1:14 Denbora hauek pantailan dagoen bertsioari dagozkio, hau da, Python hiru puntuko hamarri. Python zerrenda batek objektuen erreferentziak gordetzen ditu, beraz, gauza mota desberdinak zerrenda bat parteka dezakete. Gure aritmetika lanak zenbakiak erabiltzen ditu osoan. Antolaketa orokor baten truke ordaintzen du, zerbitzu errepikakor bat eskatzen duen bitartean. Imajinatu kafe bera milioi bat aldiz eskatzea eta edalontzi bakoitzeko inprimaki berri bat betetzea. Kafe-makina ondo dago.

1:36 Paperlana bere kabuz garatu da.

Nora mugitzen du NumPyk begizta?

1:38 NumPyk kontratua aldatzen du. Array honek tamaina finkoko puntu flotatzaileko balioak gordetzen ditu adierazitako mota batekin. Gure arraya jarraia da, beraz, bere balioak memorian elkarrekin daude. Ikuspegiek beste diseinu batzuk izan ditzakete. Eragiketa aritmetikoak badaki zer datu mota jasotzen ari den. Deiak lotea jatorrizko eragiketa batera pasatzen du. Begizta batek oraindik ere balioak bisitatzen ditu kode konpilatuaren barruan. Mota horren ezagutza berrerabili dezake lan horretan.

2:00 Python lana pasatzen duen pertsona izaten jarraitzen du. Itamar Turner Trauring-ek bereizketa azaltzen du Python Speed-en. Lote interfazeak, jatorrizko inplementazioak eta prozesadore bektore instrukzioak gauza desberdinak dira. Funtzioaren izenak oso froga gutxi ematen du.

Azkarrak GPUa edo PUZ core asko esan nahi du?

2:13 Emaitza honek NumPy erabili zuen PUZan. CuPy bezalako GPU backend batek beste leku bat aukeratzen du array-etarako eta eragiketetarako. GPU bat erosteak Python begizta arrunt hau lehen zegoen tokian exekutatzen uzten du. PUZ bektore instrukzioek hainbat balio prozesatu ditzakete batera. NumPyk makineria du onartutako kernelak aukeratzeko. Gure exekuzio-denborak erabilgarri dauden funtzioak adierazten ditu, baina ez du adierazpen honen instrukzioak trazatzen. Neurtutako irabazi osoa bektore instrukzioei ematea frogak gehiegi saltzea litzateke.

2:40 GPU erosketa-gela itxita egon daiteke. Badago zerbait oso pozgarria errendimendu-konponketa batean, erosketa bat ere bertan behera uzten duena. Zoritxarrez, benchmarkak jarraitzen du.

Noiz desagertzen da abiadura-hobekuntza ikusgarria?

2:49 Zortzi balioekin, konprehensioak irabazi zuen. Array makineria deitzeak lan txikiak baino gehiago kostatu zuen. Prest zeuden array handiagoek aurrea hartu zuten. Errepikatutako probak eta prozesu berotu bat erabili genituen. Python bertsio berriagoek gurutzaketa alda dezakete. Gero aldatu aplikazioak behar duena. Hasi Python zerrenda batekin eta amaitu Python zerrenda berri batekin. NumPy-k sarrera array bihurtu behar du eta erantzuna Python objektu bihurtu behar du berriro.

3:11 Urrats horiek fakturan sartu behar dira zure aplikazioak behar baditu. Milioi bat balio zituen kasuan, bide oso horrek hogeita zortzi milisegundo inguru iraun zuen. Konprehensioak ere hogeita zortzi inguru iraun zuen. Gure abantaila dramatikoa ia berdinketa bihurtu zen. Zati azkarra benetakoa zen. Abantaila datuak bere forma numerikoan mantentzean zetzan.

Zein muga sartu behar dira benchmarkean?

3:28 Jarraitu datuak. Hurrengo eragiketak array bat onartzen badu, mantendu arraya. Zerrendak eta arrayak behin eta berriro bihurtzen badituzu, neurtu gurutzaketa horiek. Transferentzia garesti baten aurretik gelditzeak zenbaki zehatzak ematen ditu galdera okerrentzat. Array hau biderkatzeak aldi baterako emaitza sortzen du. Jatorrizko balioak gehitzeak irteera sortzen du. Exekuzio natiboak oraindik memoria behar du eta datuak mugitzen ditu.

3:47 Eragiketa batzuek irteera-buffer bat onartzen dute, esleipenak murriztuz zure kodeak segurtasunez berrerabili dezakeenean. Lerro polit batek hainbat buffer handi eska ditzake. Python Speed-ek ere arazo hau azpimarratzen du. Esleipen-egilea izugarri axolagabea da zure estetikarekiko.

Python begizta konpilatu bat ere azkarra izan daiteke?

4:00 Begizta sintaxia ere mantendu dezakezu eta bere exekuzioa aldatu. Numba-k Python funtzio numeriko onartuak kode natibora konpilatu ditzake. Hona hemen gure probaren begizta bere konpilatzaile-dekoratzailearekin. Oraindik 'for' esaten du. Interprete bide garestia aldatu da. Konpilatu ondoren, begizta honek milisegundo erdi baino gutxiago iraun zuen prest zeuden arrayekin. Konpilazioak berak segundo bat inguru iraun zuen exekuzio honetan. Konfigurazio kostu hori baztertu zen errepikatutako denboretatik,

4:22 beraz, lan txiki puntual batek konparaketa desberdin bat merezi du. Numba-ren gidak berak gustura erakusten ditu begizta esplizituak. Hizkuntza migrazio bat hastea bide beroa aurkitu baino lehen, modu landu bat da profilatzaile bat irekitzea saihesteko. Lehenik aurkitu zer denbora kontsumitzen duen. Sareko itxaronaldiak, objektuen analisia eta aritmetika masiboak konponketa desberdinak eskatzen dituzte. Jatorrizko array eragiketek laguntzen dute kalkulua eta datuak egokitzen direnean.

4:43 Neurtu zure deitzaileak benetan behar duen emaitza. Orain lasterbide hori. Python funtzio bat duzu eta array bat onartzea nahi duzu. Vectorize izeneko wrapper batek falta den errendimendu-botoi baten antza du. Bere dokumentazioan esaldi garrantzitsu bat dago zain.

Zer exekutatzen du np.vectorizek benetan?

4:56 NumPy-k dio bere vectorize wrapper-a erosotasunerako ematen dela batez ere. Bere inplementazioa funtsean 'for' begizta bat da. Wrapperrak loteak onartzen ditu, baina zure Python funtzioa deitzen jarraitzen du hurrenez hurreneko elementuetarako. Interfazea laburragoa zen. Exekuzio-muga lanpetuta zegoen. Ikusi balio berdinak Python callback-aren bidez itzultzen. Prest zeuden arrayekin, bertsio honek laurogeita zazpi milisegundo inguru iraun zuen. Gure konprehensioa baino motelagoa zen.

5:18 Broadcast wrapper erabilgarri batek kendu nahi zenuen elementu bakoitzeko lan zehatza mantendu dezake. Egiaztatu lote-interfaze baten atzean dagoen inplementazioa, mantendu datu bateragarriak bere forma erabilgarrian, eta sartu bihurketa konparazioan. Jatorrizko, callback eta konpilatutako begiztak antzekoak izan daitezke deitzailearen aulkitik. Vectorize izenak zure kronometroak inoiz sinatu ez zuen promesa bat egin zuen. Mantendu erosotasuna behar duzunean. Errendimendurako, egiaztatu exekutatzen den begizta.

Zer aldatu beharko zenuke zure kodean?

5:41 Nire epaia SHIP IT da neurtutako zenbakizko bide bero bat lotean prozesatzeko. Mantendu begizta arruntak dagoeneko ondo funtzionatzen dutenean. Egiaztatu non gertatzen den lana eta hurrengo deitzaileak zer behar duen. Harpidetu, sakatu kanpaia, eta esan iruzkinetan desberdin zigilatuko zenukeen. Eta hori da gaurko ezberdintasuna. Ni Niko naiz Axrisi-tik. Batu arduraz.

Iturriak

  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

Lotutako bideoak