Utendaji wa Python: mizunguko asilia ya NumPy, vikumbusho na gharama za ubadilishaji
Jaribio la nambari linalodhibitiwa la CPU pekee linafuata maadili yanayofanana kupitia mizunguko ya CPython, hesabu ya NumPy, kifungashio cha kukumbusho cha Python, na mzunguko uliokusanywa wa Numba.
Jaribio la nambari linalodhibitiwa la CPU pekee linafuata maadili yanayofanana kupitia mizunguko ya CPython, hesabu ya NumPy, kifungashio cha kukumbusho cha Python, na mzunguko uliokusanywa wa Numba. NumPy iliyokuwa tayari kuingizwa ilikuwa na uongozi mkubwa, wakati ubadilishaji kutoka na kurudi kwenye orodha za Python ulipunguza faida hiyo hadi karibu sare. Kipindi kinaeleza mipaka ya utekelezaji na jinsi ya kupima matokeo ambayo programu inahitaji.
Soma toleo lililoandikwa (Kiingereza) ↗
Nini video hii inashughulikia
- CPython hukusanya msimbo chanzo kuwa bytecode. Kazi ya mkalimani/kitu inayorudiwa na mzunguko wa nambari asilia ulioandikwa ni mipangilio tofauti ya utekelezaji.
- Hesabu ya nambari ya NumPy inaweza kukabidhi vikundi vilivyoandikwa kwa shughuli zilizokusanywa; mzunguko wa hesabu bado upo, na maoni yanaweza kuwa na mipangilio isiyoendelea.
- Pima ubadilishaji na uwakilishi wa matokeo unaohitajika. Katika utendaji huu, kubadilisha orodha za Python kuwa safu na kurudi kulifuta faida kubwa ya safu tayari.
- Mizigo midogo ya kazi inaweza kupendelea Python ya kawaida kwa sababu gharama zisizobadilika za simu za safu ni muhimu. Ufahamu wa thamani nane ulishinda kulinganisha huku kupimwa.
- np.vectorize ni kifungashio rahisi kinachopiga simu Python kwa vipengele vinavyofuata; kiolesura cha kundi pekee hakianzishi utekelezaji wa nambari asilia.
- Mizunguko ya syntax ya Python iliyokusanywa inaweza pia kuwa haraka. Jumuisha gharama za kukusanya/kusanidi baridi wakati ni muhimu kwa mpigaji.
- Utekelezaji asilia, CPU SIMD, multithreading na backends za GPU ni mawazo tofauti. Vipengele vya CPU vinavyopatikana havifuatili maagizo yaliyotumika katika utendaji maalum.
Nakala iliyotafsiriwa
Imetafsiriwa kutoka simulizi asili ya Kiingereza. Sauti na manukuu yanayopatikana yanadhibitiwa na YouTube.
Kwa nini CPU ile ile inaweza kumaliza mapema?
0:00 Unafikiri Python inahitaji lugha mpya ili iwe haraka. CPU ile ile iliendesha kundi letu haraka baada ya mzunguko kuhamishwa. Kazi ilienda wapi? Kasi inapotea lini? Njia gani ya mkato inarudisha Python? Huu ni The Daily Diff, chini ya kofia. Fuatilia njia hiyo ya mkato. CPython ndio utekelezaji wa kawaida wa Python.
0:17 Inakusanya msimbo wako chanzo kuwa bytecode, kisha huendesha maelekezo hayo katika mkalimani. NumPy ni maktaba ya nambari ambayo safu zake hushikilia maadili yenye aina ya data iliyotangazwa. Hesabu yake iliyojengwa ndani inaweza kukabidhi kundi lote kwa shughuli zilizokusanywa. Chukua thamani milioni moja za nambari za kuelea, pandisha kila moja, kisha ongeza thamani asilia. Kila toleo hupata maadili yanayofanana na kutoa majibu yanayolingana. Maadili ni madogo ya kutosha kuweka tofauti za kuzungusha nje ya mashindano.
0:40 Kwenye mashine hii, ufahamu ulichukua takriban milisekunde thelathini na tatu. NumPy ilichukua chini ya moja. Zote ziliendeshwa kwenye CPU. Hiyo ni ushahidi muhimu kwa mzigo huu wa kazi, na habari mbaya kwa lugha ya programu. Anza na mzunguko wa kawaida.
Kazi gani mzunguko wa Python hurudia?
0:53 Python hupata thamani inayofuata, hufanya hesabu, na kuongeza jibu. Kisha inafanya hivyo tena. Kuzidisha ni rahisi. Kupanga kuzidisha kunayofuata, na kushughulikia vitu vya Python vinavyoizunguka, huongeza kazi kila wakati. Huu ndio mchanganuo halisi wa kazi iliyojaribiwa. Marudio, kuzidisha na kuongeza huonekana kama maagizo ya bytecode. Matoleo na wakalimani wa Python hufanya chaguzi tofauti.
1:14 Muda huu ni wa toleo lililoonyeshwa, ambalo ni Python tatu nukta kumi. Orodha ya Python huhifadhi marejeleo kwa vitu, kwa hivyo aina tofauti za vitu zinaweza kushiriki orodha. Kazi yetu ya hesabu hutumia nambari kote. Inalipa kwa mpangilio wa jumla huku ikiomba huduma inayorudiwa. Fikiria kuagiza kahawa ile ile mara milioni na kujaza fomu mpya kwa kila kikombe. Mashine ya kahawa iko sawa.
1:36 Karatasi zimetengeneza kazi yake mwenyewe.
NumPy huhamisha mzunguko wapi?
1:38 NumPy inabadilisha mkataba. Safu hii hushikilia thamani za nambari za kuelea za ukubwa maalum na aina moja iliyotangazwa. Safu yetu imeunganishwa, kwa hivyo maadili yake hukaa pamoja kwenye kumbukumbu. Maoni yanaweza kuwa na mipangilio mingine. Operesheni ya hesabu inajua aina gani ya data inapokea. Simu inakabidhi kundi kwa operesheni asilia. Mzunguko bado hutembelea maadili ndani ya msimbo uliokusanywa. Inaweza kutumia tena ujuzi wa aina hiyo katika kazi hiyo.
2:00 Python inabaki kuwa mtu anayekabidhi kazi. Itamar Turner Trauring anaelezea tofauti hiyo katika Python Speed. Violesura vya kundi, utekelezaji asilia na maelekezo ya vekta ya prosesa ni vitu tofauti. Jina la kazi hutoa ushahidi mdogo sana.
Haraka inamaanisha GPU au cores nyingi za CPU?
2:13 Matokeo haya yalitumiwa NumPy kwenye CPU. Backend ya GPU kama CuPy huchagua nyumba tofauti kwa safu na shughuli. Kununua GPU kunaacha mzunguko huu wa kawaida wa Python ukiendelea pale ulipokuwa ukiendesha tayari. Maelekezo ya vekta ya CPU yanaweza kushughulikia thamani kadhaa pamoja. NumPy ina mitambo ya kuchagua kernels zinazoungwa mkono. Muda wetu wa utekelezaji huripoti vipengele vinavyopatikana, lakini haifuatili maelekezo ya usemi huu. Kutoa faida yote iliyopimwa kwa maelekezo ya vekta kungesababisha kuzidisha ushahidi.
2:40 Kikapu cha ununuzi cha GPU kinaweza kubaki kimefungwa. Kuna kitu kinachoridhisha sana kuhusu marekebisho ya utendaji ambayo pia hughairi ununuzi. Kwa bahati mbaya, kigezo kinaendelea.
Kasi ya ajabu hupotea lini?
2:49 Kwa thamani nane, ufahamu ulishinda. Kupiga simu mashine ya safu kuligharimu zaidi ya kazi ndogo. Safu kubwa tayari ziliongoza. Tulitumia majaribio yaliyochukuliwa mara kwa mara na mchakato uliopashwa moto. Miundo mipya zaidi ya Python inaweza kubadilisha mabadiliko. Kisha ubadilishe kile ambacho programu inahitaji. Anza na orodha ya Python na umalizie na orodha mpya ya Python. NumPy lazima ibadilishe ingizo kuwa safu na kugeuza jibu kuwa vitu vya Python.
3:11 Hatua hizo ni sehemu ya bili ikiwa programu yako inazihitaji. Kwa thamani milioni moja, njia hiyo kamili ilichukua takriban milisekunde ishirini na nane. Ufahamu ulichukua takriban ishirini na nane pia. Uongozi wetu wa kushangaza ukawa karibu sare. Sehemu ya haraka ilikuwa halisi. Faida ilitegemea kuruhusu data ibaki katika umbo lake la nambari.
Ni mipaka gani inayoingia kwenye kigezo?
3:28 Fuata data. Ikiwa operesheni inayofuata inakubali safu, hifadhi safu. Ukiwa unabadilisha mara kwa mara kati ya orodha na safu, pima mabadiliko hayo. Kukaa kabla ya kukabidhiana ghali hutoa nambari sahihi kwa swali lisilo sahihi. Kuzidisha safu hii huunda matokeo ya muda. Kuongeza maadili asilia huunda matokeo. Utekelezaji asilia bado unahitaji kumbukumbu na husogeza data.
3:47 Baadhi ya shughuli hukubali bafa ya matokeo, kupunguza ugawaji wakati msimbo wako unaweza kuitumia tena kwa usalama. Mstari mmoja mzuri unaweza kuagiza bafa kubwa kadhaa. Kasi ya Python inaashiria tatizo hili pia. Mgawaji hajali sana kuhusu uzuri wako.
Je, mzunguko wa Python uliokusanywa unaweza pia kuwa haraka?
4:00 Unaweza pia kuweka sintaksia ya mzunguko na kubadilisha utekelezaji wake. Numba inaweza kukusanya kazi za Python za nambari zinazoungwa mkono kuwa msimbo asilia. Huu hapa ni mzunguko kutoka kwa jaribio letu na kipambaji chake cha mkusanya. Bado inasema kwa. Njia ghali ya mkalimani imebadilika. Baada ya kukusanywa, mzunguko huu ulichukua chini ya nusu milisekunde na safu tayari. Ukusanyaji wenyewe ulichukua takriban sekunde moja katika utendaji huu. Gharama hiyo ya usanidi ilitengwa kutoka kwa muda uliorudiwa,
4:22 kwa hivyo kazi ndogo ya mara moja inahitaji kulinganisha tofauti. Mwongozo wa Numba yenyewe unafurahi kuonyesha mizunguko wazi. Kuanza uhamiaji wa lugha kabla ya kupata njia moto ni njia tata ya kuepuka kufungua profiler. Kwanza pata kinachotumia muda. Kusubiri kwa mtandao, uchambuzi wa vitu na hesabu ya wingi inahitaji marekebisho tofauti. Shughuli za safu asilia husaidia wakati hesabu na data zinafaa.
4:43 Pima matokeo ambayo mpigaji wako anahitaji. Sasa kwa njia hiyo ya mkato. Una kazi ya Python na unataka ikubali safu. Kifungashio kinachoitwa vectorize kinaonekana kama kitufe cha utendaji kilichokosekana. Hati zake zina sentensi muhimu inayosubiri.
np.vectorize inatekeleza nini hasa?
4:56 NumPy inasema kifungashio chake cha vectorize kinatolewa kimsingi kwa urahisi. Utekelezaji wake kimsingi ni mzunguko wa for. Kifungashio kinakubali vikundi, lakini kinaendelea kupiga kazi yako ya Python kwa vipengele vinavyofuata. Kiolesura kilifupika. Mpaka wa utekelezaji ulibaki na shughuli nyingi. Tazama maadili yale yale yakirudi kupitia kukumbusho kwa Python. Kwa safu tayari, toleo hili lilichukua takriban milisekunde themanini na saba. Ilikuwa polepole kuliko ufahamu wetu.
5:18 Kifungashio muhimu cha utangazaji kinaweza kuhifadhi kazi halisi kwa kila kipengele uliyokuwa ukijaribu kuondoa. Angalia utekelezaji nyuma ya kiolesura cha kundi, weka data inayolingana katika umbo lake lenye manufaa, na ujumuishe ubadilishaji katika kulinganisha. Mizunguko asilia, ya kukumbusho na iliyokusanywa inaweza kuonekana sawa kutoka kwa kiti cha mpigaji. Jina vectorize lilitoa ahadi ambayo saa yako ya kusimamisha haikuwahi kusaini. Iweke wakati urahisi ndio unachohitaji. Kwa utendaji, angalia mzunguko unaoendesha.
Unapaswa kubadilisha nini kwenye msimbo wako?
5:41 Uamuzi wangu ni SHIP IT kwa kundi la njia ya nambari iliyopimwa ya moto. Weka mizunguko ya kawaida wakati tayari inafanya kazi vizuri. Angalia wapi kazi inafanyika na nini mpigaji anayefuata anahitaji. Jisajili, bonyeza kengele, na uniambie kwenye maoni kama ungekuwa umekichapa tofauti. Na hiyo ndiyo tofauti kwa leo. Mimi ni Niko kutoka Axrisi. Unganisha kwa uwajibikaji.
Vyanzo
- Universal functions (ufunc) basics — NumPy 2.2NumPy
- The N-dimensional array — NumPy 2.2NumPy
- numpy.vectorize — convenience and performance notesNumPy
- CPU/SIMD optimizations — NumPy 2.2NumPy
- dis — Disassembler for Python bytecodePython Software Foundation
- CPython 3.10.12 list representationCPython contributors
- The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
- Performance TipsNumba
- Basics of CuPyCuPy



