+− THE DAILY DIFFdev & AI news
SHIP IT

Python našumas: „NumPy“ vietinės ciklo operacijos, atskambinimo funkcijos ir konvertavimo kaštai

Valdomas tik CPU skirtas skaitmeninis testas seka identiškas reikšmes per „CPython“ ciklus, „NumPy“ aritmetiką, „Python“ atskambinimo funkcijos apgaubą ir sukompiliuotą „Numba“ ciklą.

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

Valdomas tik CPU skirtas skaitmeninis testas seka identiškas reikšmes per „CPython“ ciklus, „NumPy“ aritmetiką, „Python“ atskambinimo funkcijos apgaubą ir sukompiliuotą „Numba“ ciklą. „NumPy“ su paruošta įvestimi turėjo didelį pranašumą, o konvertavimas iš „Python“ sąrašų ir atgal sumažino šį pranašumą iki beveik lygios situacijos. Epizodas paaiškina vykdymo ribas ir kaip išmatuoti rezultatą, kurio reikia programai.

Skaityti rašytinę versiją (anglų k.) ↗

Kas aptariama šiame vaizdo įraše

  • CPython kompiliuoja išeities kodą į baitkodą. Pakartotinis interpretatoriaus/objekto darbas ir tipizuotas vietinis skaitmeninis ciklas yra skirtingi vykdymo būdai.
  • Skaitmeninė „NumPy“ aritmetika gali perduoti tipizuotus paketus sukompiliuotoms operacijoms; aritmetinis ciklas vis dar egzistuoja, o rodiniai gali turėti netolygų išdėstymą.
  • Išmatuokite konversiją ir reikiamą išvesties pateikimą. Šiame vykdyme „Python“ sąrašų konvertavimas į masyvus ir atgal panaikino didelį paruošto masyvo pranašumą.
  • Mažiems darbo krūviams gali būti tinkamesnis įprastas „Python“, nes svarbu fiksuoti masyvo iškvietimo kaštai. Šį išmatuotą palyginimą laimėjo aštuonių reikšmių supratimas.
  • „np.vectorize“ yra patogumo įvyniotuvas, kuris iškviečia „Python“ kiekvienam sekančiam elementui; vien tik paketinis interfeisas nenustato vietinio skaitmeninio vykdymo.
  • Sukompiliuotos „Python“ sintaksės ciklo operacijos taip pat gali būti greitos. Įtraukite šaltos kompiliacijos/nustatymo kaštus, kai jie yra svarbūs iškvietėjui.
  • Vietinis vykdymas, CPU SIMD, daugiasrautis apdorojimas ir GPU galiniai elementai yra atskiros idėjos. Galimos CPU funkcijos nefiksuoja konkrečiame vykdyme naudojamų instrukcijų.

Išverstas transkriptas

Išversta iš originalo anglų kalbos. Galimas garso ir subtitrų valdymas per YouTube.

Kodėl tas pats procesorius gali baigti anksčiau?

0:00 Manote, kad „Python“ reikia naujos kalbos, kad ji taptų greita. Tas pats CPU greičiau apdorojo mūsų partiją, kai ciklas persikėlė. Kur dingo darbas? Kada greičio padidėjimas dingsta? Kuris trumpinys grąžina „Python“? Tai „The Daily Diff“, iš vidaus. Stebėkite tą trumpinį. CPython yra standartinė Python implementacija.

0:17 Jis kompiliuoja jūsų šaltinį į baitkodą, tada vykdo tas instrukcijas interpreteryje. NumPy yra skaitmeninė biblioteka, kurios masyvai saugo reikšmes su deklaruotu duomenų tipu. Jos įmontuota aritmetika gali perduoti visą paketą sukompiliuotoms operacijoms. Paimkite milijoną slankiojo kablelio reikšmių, kiekvieną pakelkite kvadratu, tada pridėkite pradinę reikšmę. Kiekviena versija gauna identiškas reikšmes ir pateikia atitinkamus atsakymus. Reikšmės yra pakankamai mažos, kad išvengtume apvalinimo skirtumų.

0:40 Šioje mašinoje supratimas užtruko apie trisdešimt tris milisekundes. „NumPy“ užtruko mažiau nei vieną. Abu veikė ant CPU. Tai naudingas įrodymas šiam darbo krūviui ir siaubingas nekrologas programavimo kalbai. Pradėkime nuo įprasto ciklo.

Kokį darbą kartoja „Python“ ciklas?

0:53 „Python“ paima kitą reikšmę, atlieka aritmetiką ir prideda atsakymą. Tada tai daro vėl. Dauginimas yra pigus. Kito dauginimo organizavimas ir „Python“ objektų tvarkymas aplink jį kiekvieną kartą prideda darbo. Tai yra tikrasis patikrintos funkcijos išardymas. Iteracija, daugyba ir sudėtis atrodo kaip baitkodo instrukcijos. Python versijos ir interpretatoriai priima skirtingus sprendimus.

1:14 Šie laikai priklauso ekrane matomai versijai, tai yra Python tris taškas dešimt. Python sąrašas saugo nuorodas į objektus, todėl skirtingi dalykai gali dalytis sąrašu. Mūsų aritmetinė užduotis visur naudoja skaičius. Ji moka už bendrą išdėstymą, prašydama pasikartojančios paslaugos. Įsivaizduokite, kad užsakote tą pačią kavą milijoną kartų ir pildote naują formą kiekvienam puodeliui. Kavos aparatas veikia puikiai.

1:36 Dokumentai išsiplėtojo į atskirą karjerą.

Kur „NumPy“ perkelia ciklą?

1:38 NumPy keičia sutartį. Šis masyvas saugo fiksuoto dydžio slankiojo kablelio reikšmes su vienu deklaruotu tipu. Mūsų masyvas yra vientisas, todėl jo reikšmės atmintyje sėdi kartu. Rodiniai gali turėti kitokį išdėstymą. Aritmetinė operacija žino, kokius duomenis gauna. Iškvietimas perduoda partiją vietinei operacijai. Ciklas vis dar aplanko reikšmes sukompiliuotame kode. Jis gali pakartotinai panaudoti žinias apie tipą per tą darbą.

2:00 „Python“ išlieka asmeniu, perduodančiu darbą. Itamaras Turneris Trauringas paaiškina skirtumą „Python Speed“. Paketinės sąsajos, vietinės implementacijos ir procesoriaus vektorinės instrukcijos yra atskiri dalykai. Funkcijos pavadinimas pateikia labai mažai įrodymų.

Ar greitai reiškia GPU ar daug CPU branduolių?

2:13 Šis rezultatas pasiekė „NumPy“ naudojant CPU. GPU galinis elementas, toks kaip „CuPy“, parenka kitą vietą masyvams ir operacijoms. Pirkdami GPU paliekate šį įprastą „Python“ ciklą veikti ten, kur jis jau veikė. CPU vektorinės instrukcijos gali apdoroti kelias reikšmes vienu metu. „NumPy“ turi mechanizmą, skirtą pasirinkti palaikomus branduolius. Mūsų vykdymo laikas praneša apie galimas funkcijas, bet nefiksuoja šios išraiškos instrukcijų. Visą išmatuotą pelną priskirti vektorinėms instrukcijoms būtų pervertinimas įrodymų.

2:40 GPU pirkinių krepšelis gali likti uždarytas. Yra kažkas giliai malonaus atliekant našumo pataisymą, kuris taip pat atšaukia pirkinį. Deja, etaloninis testas tęsiasi.

Kada įspūdingas pagreitis dingsta?

2:49 Su aštuoniomis vertėmis, supratimas laimėjo. Masyvo mechanizmų iškvietimas kainavo daugiau nei mažas darbas. Dideli paruošti masyvai išsiveržė į priekį. Mes naudojome pakartotinius bandymus ir įšildytą procesą. Naujesnės „Python“ versijos gali pakeisti perėjimą. Tada pakeiskite tai, ko reikia programai. Pradėkite su „Python“ sąrašu ir užbaikite su nauju „Python“ sąrašu. „NumPy“ turi konvertuoti įvestį į masyvą ir atsakymą paversti atgal į „Python“

3:11 objektus. Šie žingsniai priklauso nuo sąskaitos, jei jūsų programai jų reikia. Su milijonu reikšmių, šis visas kelias užtruko apie dvidešimt aštuonias milisekundes. Supratimas taip pat užtruko apie dvidešimt aštuonias. Mūsų dramatiškas pranašumas tapo beveik lygiomis. Greita dalis buvo tikra. Privalumas priklausė nuo to, ar duomenys liko savo skaitmeninėje formoje.

Kurios ribos priklauso lyginamajai analizei?

3:28 Sekite duomenis. Jei kita operacija priima masyvą, palikite masyvą. Jei nuolat konvertuojate tarp sąrašų ir masyvų, išmatuokite tuos perėjimus. Sustojimas prieš brangų perdavimą suteikia tikslius skaičius neteisingam klausimui. Padauginus šį masyvą sukuriama laikina rezultatas. Pridėjus originalias reikšmes sukuriamas rezultatas. Vietinis vykdymas vis dar reikalauja atminties ir perkelia duomenis.

3:47 Kai kurios operacijos priima išvesties buferį, sumažindamos atminties asignavimus, kai jūsų kodas gali saugiai jį pakartotinai naudoti. Viena graži eilutė gali užsakyti keletą didelių buferių. „Python Speed“ taip pat nurodo šią problemą. Alokatorius yra nepaprastai abejingas jūsų estetikai.

Ar sukompiliuotas „Python“ ciklas taip pat gali būti greitas?

4:00 Taip pat galite išsaugoti ciklo sintaksę ir pakeisti jos vykdymą. „Numba“ gali kompiliuoti palaikomas skaitmenines „Python“ funkcijas į vietinį kodą. Štai ciklas iš mūsų testo su jo kompiliatoriaus dekoratoriumi. Jis vis dar sako „for“. Brangus interpretatoriaus kelias pasikeitė. Po kompiliacijos, šis ciklas užtruko mažiau nei pusę milisekundės su paruoštais masyvais. Pati kompiliacija šiame vykdyme užtruko apie sekundę. Šios nustatymo išlaidos nebuvo įtrauktos į pakartotinius laikus,

4:22 todėl maža vienkartinė užduotis nusipelno kitokio palyginimo. Pats „Numba“ vadovas mielai rodo aiškius ciklus. Pradėti kalbos migraciją, neradus karšto kelio, yra sudėtingas būdas išvengti profiliavimo įrankio atidarymo. Pirmiausia išsiaiškinkite, kas sunaudoja laiką. Tinklo laukimai, objektų analizavimas ir didelės apimties aritmetika reikalauja skirtingų pataisymų. Vietinės masyvo operacijos padeda, kai skaičiavimas ir duomenys tinka.

4:43 Išmatuokite rezultatą, kurio iš tikrųjų reikia jūsų iškvietėjui. Dabar apie tą trumpinį. Turite „Python“ funkciją ir norite, kad ji priimtų masyvą. „vectorize“ pavadintas apgaubas skamba kaip trūkstamas našumo mygtukas. Jo dokumentacijoje laukia svarbus sakinys.

Ką iš tikrųjų vykdo „np.vectorize“?

4:56 „NumPy“ teigia, kad jo „vectorize“ apgaubas teikiamas visų pirma patogumui. Jo implementacija iš esmės yra „for“ ciklas. Apgaubas priima paketus, bet toliau kviečia jūsų „Python“ funkciją sekančiais elementais. Sąsaja sutrumpėjo. Vykdymo riba išliko užimta. Stebėkite, kaip tos pačios reikšmės grįžta per „Python“ atskambinimo funkciją. Su paruoštais masyvais ši versija užtruko apie aštuoniasdešimt septynias milisekundes. Ji buvo lėtesnė nei mūsų supratimas.

5:18 Naudingas transliavimo įvyniotuvas gali išsaugoti tikslų darbą su kiekvienu elementu, kurį bandėte pašalinti. Patikrinkite įgyvendinimą už paketinės sąsajos, laikykite suderinamus duomenis jų naudinga forma ir įtraukite konvertavimą į palyginimą. Vietinės, atskambinimo ir sukompiliuotos ciklo operacijos gali atrodyti panašiai iš iškvietėjo perspektyvos. Pavadinimas „vectorize“ davė pažadą, kurio jūsų chronometras niekada nepasirašė. Palikite jį, kai jums reikia patogumo. Dėl našumo patikrinkite, kuris ciklas veikia.

Ką turėtumėte pakeisti savo kode?

5:41 Mano verdiktas yra SHIP IT už išmatuoto skaitmeninio karšto kelio partiją. Laikykitės įprastų ciklų, kai jie jau gerai veikia. Patikrinkite, kur vyksta darbas ir ko reikia kitam skambinančiajam. Prenumeruokite, paspauskite varpelį ir parašykite komentaruose, jei būtumėte tai patvirtinę kitaip. Ir tai yra šiandienos skirtumas. Aš esu Niko iš Axrisi. Apjungti atsakingai.

Šaltiniai

  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

Susiję vaizdo įrašai