+− THE DAILY DIFFdev & AI news
SHIP IT

Python veiktspēja: vietējās NumPy cilpas, atzvanīšanas funkcijas un konversijas izmaksas

Kontrolēts tikai CPU numeriskais tests seko identiskām vērtībām caur CPython cilpām, NumPy aritmētiku, Python atzvanīšanas funkcijas apvalku un kompilētu Numba cilpu.

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

Kontrolēts tikai CPU numeriskais tests seko identiskām vērtībām caur CPython cilpām, NumPy aritmētiku, Python atzvanīšanas funkcijas apvalku un kompilētu Numba cilpu. Gatavā ievades NumPy ieguva lielu pārsvaru, savukārt konversija no un atpakaļ uz Python sarakstiem samazināja šo priekšrocību līdz gandrīz neizšķirtam. Epizode izskaidro izpildes robežu un to, kā izmērīt rezultātu, kas nepieciešams lietojumprogrammai.

Lasiet rakstisko izdevumu (angļu valodā) ↗

Ko aptver šis video

  • CPython kompilē avotu uz baitkodu. Atkārtots interpretatora/objekta darbs un tipizēta vietējā skaitliskā cilpa ir dažādi izpildes izkārtojumi.
  • Skaitliskā NumPy aritmētika var nodot tipizētas partijas kompilētām operācijām; aritmētiskā cilpa joprojām pastāv, un skatiem var būt neblīvi izkārtojumi.
  • Mēriet konversijas un nepieciešamo izvades reprezentāciju. Šajā izpildē, Python sarakstu pārvēršana masīvos un atpakaļ novērsa lielo gatavo masīvu pārsvaru.
  • Mazās slodzes var dot priekšroku parastam Python, jo ir svarīgas fiksētās masīvu izsaukumu izmaksas. Šajā mērītajā salīdzinājumā uzvarēja astoņu vērtību izpratne.
  • np.vectorize ir ērtību apvalks, kas izsauc Python secīgiem elementiem; tikai partijas saskarne nenodrošina vietējo skaitlisko izpildi.
  • Kompilētas Python sintakses cilpas arī var būt ātras. Iekļaujiet aukstās kompilācijas/iestatīšanas izmaksas, ja tās ir svarīgas izsaucošajam.
  • Vietējā izpilde, CPU SIMD, daudzpavedienu un GPU aizmugursistēmas ir atsevišķas idejas. Pieejamās CPU funkcijas nenorāda instrukcijas, kas izmantotas konkrētā izpildē.

Tulkotais transkripts

Tulkojums no oriģinālā angļu stāstījuma. Pieejamais audio un subtitri tiek kontrolēti no YouTube.

Kāpēc tas pats CPU var pabeigt ātrāk?

0:00 Jūs domājat, ka Python ir vajadzīga jauna valoda, lai kļūtu ātrs. Tas pats CPU palaida mūsu partiju ātrāk pēc cilpas pārvietošanas. Kur palika darbs? Kad ātruma pieaugums pazūd? Kāds saīsne atgriež Python atpakaļ? Šis ir The Daily Diff, aizkulisēs. Sekojiet līdzi šim saīsnei. CPython ir standarta Python implementācija.

0:17 Tas kompilē jūsu avotu baitkodā, pēc tam izpilda šīs instrukcijas interpretatorā. NumPy ir skaitliska bibliotēka, kuras masīvi glabā vērtības ar deklarētu datu tipu. Tā iebūvētā aritmētika var nodot visu partiju kompilētām operācijām. Paņemiet miljonu peldošā komata vērtību, katru no tām kvadrātā, pēc tam pievienojiet sākotnējo vērtību. Katra versija iegūst identiskas vērtības un rada atbilstošas atbildes. Vērtības ir pietiekami mazas, lai no sacensībām izslēgtu noapaļošanas atšķirības.

0:40 Šajā mašīnā izpratne aizņēma apmēram trīsdesmit trīs milisekundes. NumPy aizņēma mazāk par vienu. Abi darbojās uz CPU. Tas ir noderīgs pierādījums šai slodzei un šausmīga nekrologs programmēšanas valodai. Sāksim ar parasto cilpu.

Kādu darbu atkārto Python cilpa?

0:53 Python iegūst nākamo vērtību, veic aritmētiku un pievieno atbildi. Pēc tam tas to dara atkal. Reizināšana ir lēta. Nākamās reizināšanas organizēšana un Python objektu apstrāde ap to pievieno darbu katru reizi. Šī ir testētās funkcijas faktiskā dezasemblēšana. Iterācija, reizināšana un saskaitīšana parādās kā baitkoda instrukcijas. Python versijas un interpretatori izdara dažādas izvēles.

1:14 Šie laiki pieder ekrānā redzamajai versijai, kas ir Python trīs punkti desmit. Python saraksts glabā atsauces uz objektiem, tāpēc dažādas lietas var dalīties sarakstā. Mūsu aritmētikas darbs visur izmanto skaitļus. Tas maksā par vispārīgu izkārtojumu, pieprasot atkārtotu pakalpojumu. Iedomājieties, ka pasūtāt to pašu kafiju miljons reižu un aizpildāt jaunu veidlapu katrai tasei. Kafijas automāts ir kārtībā.

1:36 Dokumenti ir izveidojuši savu karjeru.

Kur NumPy pārvieto cilpu?

1:38 NumPy maina līgumu. Šis masīvs glabā fiksēta izmēra peldošā komata vērtības ar vienu deklarētu tipu. Mūsu masīvs ir blīvs, tāpēc tā vērtības atrodas kopā atmiņā. Skatiem var būt citi izkārtojumi. Aritmētiskā operācija zina, kāda veida datus tā saņem. Izsaukums nodod partiju vietējai operācijai. Cilpa joprojām apmeklē vērtības kompilētā kodā. Tā var atkārtoti izmantot zināšanas par tipu visā šajā darbā.

2:00 Python paliek persona, kas nodod darbu. Itamar Turner Trauring paskaidro atšķirību Python Speed. Partijas saskarnes, vietējās implementācijas un procesoru vektoru instrukcijas ir atsevišķas lietas. Funkcijas nosaukums sniedz ļoti maz pierādījumu.

Vai ātrs nozīmē GPU vai daudzus CPU kodolus?

2:13 Šis rezultāts izmantoja NumPy uz CPU. GPU aizmugursistēma, piemēram, CuPy, izvēlas citu vietu masīviem un operācijām. GPU iegāde atstāj šo parasto Python cilpu darboties tur, kur tā jau darbojās. CPU vektoru instrukcijas var apstrādāt vairākas vērtības kopā. NumPy ir mehānismi atbalstītu kodolu izvēlei. Mūsu izpildes laiks ziņo par pieejamām funkcijām, bet neizseko šīs izteiksmes instrukcijas. Visu izmērīto ieguvumu attiecināt uz vektoru instrukcijām būtu pārdot pierādījumus.

2:40 GPU iepirkumu grozs var palikt aizvērts. Ir kaut kas dziļi apmierinošs veiktspējas labojumā, kas arī atceļ pirkumu. Diemžēl etalons turpinās.

Kad iespaidīgais ātruma pieaugums pazūd?

2:49 Ar astoņām vērtībām uzvarēja izpratne. Masīvu mehānismu izsaukšana maksāja vairāk nekā niecīgais darbs. Lielāki gatavi masīvi izvirzījās priekšā. Mēs izmantojām atkārtotus mēģinājumus un iesildītu procesu. Jaunākas Python versijas var mainīt krustpunktu. Pēc tam mainiet to, kas nepieciešams lietojumprogrammai. Sāciet ar Python sarakstu un beidziet ar jaunu Python sarakstu. NumPy ir jāpārvērš ievade masīvā un atbilde jāpārvērš atpakaļ Python

3:11 objektos. Šie soļi ir jāiekļauj rēķinā, ja jūsu lietojumprogrammai tie ir nepieciešami. Pie miljona vērtību, šis pilnīgais ceļš aizņēma apmēram divdesmit astoņas milisekundes. Izpratne arī aizņēma apmēram divdesmit astoņas. Mūsu dramatiskais pārsvars kļuva par gandrīz neizšķirtu. Ātrā daļa bija reāla. Priekšrocība bija atkarīga no tā, vai datus ļāva saglabāt to skaitliskajā formā.

Kuras robežas pieder etalonam?

3:28 Sekojiet datiem. Ja nākamā operācija pieņem masīvu, saglabājiet masīvu. Ja jūs atkārtoti konvertējat starp sarakstiem un masīviem, izmēriet šos krustojumus. Apstāšanās pirms dārgas nodošanas sniedz precīzus skaitļus nepareizam jautājumam. Šī masīva reizināšana rada pagaidu rezultātu. Sākotnējo vērtību pievienošana rada izvadi. Vietējā izpilde joprojām prasa atmiņu un pārvieto datus.

3:47 Dažas operācijas pieņem izvades buferi, samazinot piešķiršanu, ja jūsu kods var to droši atkārtoti izmantot. Viena skaista rinda var pasūtīt vairākus lielus buferus. Python Speed arī norāda uz šo problēmu. Alokators ir ārkārtīgi vienaldzīgs pret jūsu estētiku.

Vai kompilēta Python cilpa arī var būt ātra?

4:00 Jūs varat arī saglabāt cilpas sintaksi un mainīt tās izpildi. Numba var kompilēt atbalstītās skaitliskās Python funkcijas vietējā kodā. Šeit ir cilpa no mūsu testa ar tās kompilatora dekoratoru. Tas joprojām saka 'for'. Dārgā interpretatora ceļš ir mainījies. Pēc kompilācijas šī cilpa aizņēma mazāk nekā pusmilisekundi ar gataviem masīviem. Pati kompilācija šajā izpildē aizņēma apmēram sekundi. Šīs iestatīšanas izmaksas tika izslēgtas no atkārtotajiem laikiem,

4:22 tāpēc niecīgs vienreizējs darbs ir pelnījis citu salīdzinājumu. Numbas paša ceļvedis labprāt parāda skaidras cilpas. Valodu migrācijas uzsākšana pirms karstā ceļa atrašanas ir sarežģīts veids, kā izvairīties no profileru atvēršanas. Vispirms noskaidrojiet, kas patērē laiku. Tīkla gaidīšana, objektu parsēšana un masveida aritmētika prasa dažādus labojumus. Vietējās masīvu operācijas palīdz, ja aprēķins un dati atbilst.

4:43 Izmēriet rezultātu, kas jūsu izsaucējam patiešām ir nepieciešams. Tagad par to saīsni. Jums ir Python funkcija un vēlaties, lai tā pieņem masīvu. Apvalks ar nosaukumu vectorize izklausās pēc trūkstošās veiktspējas pogas. Tās dokumentācijā ir svarīgs teikums, kas gaida.

Ko patiesībā izpilda np.vectorize?

4:56 NumPy saka, ka tās vectorize apvalks ir paredzēts galvenokārt ērtībai. Tā implementācija būtībā ir 'for' cilpa. Apvalks pieņem partijas, bet turpina izsaukt jūsu Python funkciju secīgiem elementiem. Saskarne kļuva īsāka. Izpildes robeža palika aizņemta. Vērojiet, kā tās pašas vērtības atgriežas caur Python atzvanīšanas funkciju. Ar gataviem masīviem šī versija aizņēma apmēram astoņdesmit septiņas milisekundes. Tā bija lēnāka nekā mūsu izpratne.

5:18 Noderīgs apraides apvalks var saglabāt precīzu darbu katram elementam, ko jūs mēģinājāt noņemt. Pārbaudiet implementāciju aiz partijas saskarnes, saglabājiet saderīgus datus to noderīgajā formā un iekļaujiet konversiju salīdzinājumā. Vietējās, atzvanīšanas un kompilētās cilpas var izskatīties līdzīgas no izsaucēja puses. Nosaukums 'vectorize' deva solījumu, ko jūsu hronometrs nekad neparakstīja. Saglabājiet to, ja ērtības ir tas, kas jums ir nepieciešams. Veiktspējai pārbaudiet cilpu, kas darbojas.

Kas jums jāmaina savā kodā?

5:41 Mans spriedums ir SHIP IT partijām izmērītai skaitliskai karstajai takai. Saglabājiet parastās cilpas, ja tās jau labi darbojas. Pārbaudiet, kur notiek darbs un kas ir nepieciešams nākamajam izsaucējam. Abonējiet, nospiediet zvanu un pastāstiet komentāros, vai jūs būtu to apzīmogojis citādi. Un tas ir šodienas atšķirība. Esmu Niko no Axrisi. Apvienojiet atbildīgi.

Avoti

  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

Saistītie video