+− THE DAILY DIFFdev & AI news
SHIP IT

Python afköst: innfæddir NumPy lykkjur, endurkallanir og umbreytingarkostnaður

Stýrt tölulegt próf sem keyrir á eingöngu örgjörva fylgir sömu gildum í gegnum CPython lykkjur, NumPy reikninga, Python "callback" vafning og safnaða Numba lykkju.

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

Stýrt tölulegt próf sem keyrir á eingöngu örgjörva fylgir sömu gildum í gegnum CPython lykkjur, NumPy reikninga, Python "callback" vafning og safnaða Numba lykkju. NumPy með tilbúnum innslátt hafði mikið forskot, á meðan umbreyting frá og aftur í Python lista minnkaði þann forskot í nánast jafntefli. Þátturinn útskýrir útfærslumörk og hvernig á að mæla þau gildi sem forrit þarf.

Lestu skriflegu útgáfuna (enska) ↗

Það sem þetta myndband fjallar um

  • CPython safnar frumkóða í bætakóða. Endurtekin vinna túlkara/hlutar og innfædd, slegin töluleg lykkja eru mismunandi útfærslufyrirkomulag.
  • Töluleg NumPy reikningur getur sent slegnar lotur til safnaðra aðgerða; reikningslykkjan er enn til staðar og útsýni geta haft óaðfinnanlegar skipulag.
  • Mældu umbreytingu og nauðsynlega úttakssýningu. Í þessari keyrslu eyddi umbreyting á Python listum í fylki og aftur til baka stóru forskoti tilbúinna fylkja.
  • Lítil verkefni geta hyglt venjulegum Python vegna þess að fastur kostnaður við fylkisköllun skiptir máli. Átta gilda samantektin vann þennan mælda samanburð.
  • np.vectorize er þægindaumsláttur sem kallar Python fyrir hvert stak; lotuviðmót eitt sér stofnar ekki innfædda tölulega útfærslu.
  • Samsettar Python-setningafræðilykkjur geta einnig verið hraðar. Innifalið kostnað við kalda samsetningu/uppsetningu þegar það skiptir máli fyrir þann sem kallar á það.
  • Innfædd útfærsla, CPU SIMD, fjölþráðun og GPU bakendur eru aðskildar hugmyndir. Tiltækar CPU eiginleikar rekja ekki leiðbeiningarnar sem notaðar eru í tiltekinni keyrslu.

Þýtt afrit

Þýtt úr upprunalegri enskri frásögn. Tiltækt hljóð og textar eru stjórnaðir af YouTube.

Af hverju getur sami örgjörvinn lokið fyrr?

0:00 Þú heldur að Python þurfi nýtt tungumál til að verða hratt. Sami örgjörvi keyrði lotuna okkar hraðar eftir að lykkjan færðist. Hvert fór verkið? Hvenær hverfur hraðaupphlaupið? Hvaða flýtileið færir Python aftur? Þetta er The Daily Diff, undir yfirborðinu. Fylgstu með þeirri flýtileið. CPython er staðlaða Python útfærslan.

0:17 Það þýðir frumkóðann þinn í bætakóða, keyrir síðan þessar leiðbeiningar í túlkara. NumPy er tölulegt safn þar sem fylki geyma gildi með tilgreindri gagnagerð. Innbyggð reikningur þess getur sent heila lotu til samsettra aðgerða. Taktu milljón fljótandi kommutölur, margfaldaðu hverja um sig, bættu síðan við upprunalegu gildinu. Sérhver útgáfa fær eins gildi og framleiðir samsvarandi svör. Gildin eru nógu lítil til að halda kringlóttum mismun úr keppninni.

0:40 Á þessari vél tók skilningurinn um þrjátíu og þrjú millisekúndur. NumPy tók innan við eina. Bæði keyrðu á örgjörvanum. Þetta eru gagnlegar sannanir fyrir þetta verkefni, og hræðileg minningargrein fyrir forritunarmál. Byrjaðu á venjulegri lykkju.

Hvaða vinnu endurtekur Python lykkja?

0:53 Python fær næsta gildi, framkvæmir reikninginn og bætir svarinu við. Svo gerir það það aftur. Margföldunin er ódýr. Að skipuleggja næstu margföldun, og meðhöndla Python hlutina í kringum hana, bætir við vinnu í hvert skipti. Þetta er raunveruleg sundurgreining prófunarfallaðgerðarinnar. Endurtekning, margföldun og samlagning birtast sem bætakóðaleiðbeiningar. Python útgáfur og túlkendur taka mismunandi ákvarðanir.

1:14 Þessar tímasetningar tilheyra útgáfunni á skjánum, sem er Python þrír punktur tíu. Python listi geymir tilvísanir í hluti, svo mismunandi tegundir af hlutum geta deilt lista. Reikningsstarf okkar notar tölur alls staðar. Það borgar fyrir almenna skipulagningu á meðan það biður um endurteknar þjónustu. Ímyndaðu þér að panta sama kaffið milljón sinnum og fylla út nýtt eyðublað fyrir hvern bolla. Kaffivélin er í lagi.

1:36 Pappírsvinnan hefur þróað sinn eigin feril.

Hvar færir NumPy lykkjuna?

1:38 NumPy breytir samningnum. Þetta fylki geymir fljótandi kommutölur af fastri stærð með einni tilgreindri tegund. Fylkið okkar er samfellt, svo gildin þess sitja saman í minni. Skoðanir geta haft önnur skipulag. Reikningsaðgerðin veit hvaða tegund gagna hún er að taka á móti. Kallið sendir lotuna til innfæddrar aðgerðar. Lykkja fer enn yfir gildin innan samsetts kóða. Hún getur endurnýtt þekkingu á tegundinni yfir þessa vinnu.

2:00 Python er enn manneskjan sem afhendir starfið. Itamar Turner Trauring útskýrir muninn í Python Speed. Lotuviðmót, innfæddar útfærslur og örgjörvavirkjar eru aðskildar. Nafn fallsins gefur mjög litlar sannanir.

Þýðir hratt GPU eða margir CPU kjarnar?

2:13 Þessi niðurstaða notaði NumPy á örgjörva. GPU bakendi eins og CuPy velur annað heimili fyrir fylki og aðgerðir. Að kaupa GPU lætur þessa venjulegu Python lykkju keyra þar sem hún keyrði þegar. CPU vektarleiðbeiningar geta unnið nokkur gildi saman. NumPy hefur vélbúnað til að velja studda kjarna. Keyrslutími okkar tilkynnir tiltæka eiginleika, en rekur ekki þessa tjáningu, leiðbeiningar. Að gefa allan mæltan ávinning til vektarleiarbeininga myndi ofselja sannanirnar.

2:40 Innkaupakörfu GPU getur haldist lokuð. Það er eitthvað djúpt ánægjulegt við frammistöðubót sem líka hættir við kaup. Því miður heldur viðmiðið áfram.

Hvenær hverfur hið áhrifamikla hraðaupphlaup?

2:49 Með átta gildum vann skilningurinn. Að kalla á fylkisvélbúnað kostaði meira en örsmátt verkið. Stærri tilbúin fylki tóku forystuna. Við notuðum endurtekin hlaup og upphitað ferli. Nýrri Python smíðar geta breytt krossinum. Breyttu síðan því sem forritið þarfnast. Byrjaðu á Python lista og endaðu á ferskum Python lista. NumPy verður að breyta inntakinu í fylki og breyta svarinu aftur í Python

3:11 hluti. Þau skref tilheyra reikningnum ef forritið þitt þarfnast þeirra. Við eina milljón gilda tók sú heildarleið um tuttugu og átta millisekúndur. Skilningurinn tók líka um tuttugu og átta. Dramatíska forystan okkar varð nánast jafntefli. Hraði hlutinn var raunverulegur. Kosturinn fólst í því að láta gögnin vera í tölulegu formi.

Hvaða mörk tilheyra viðmiðinu?

3:28 Fylgdu gögnunum. Ef næsta aðgerð tekur við fylki, haltu fylkinu. Ef þú breytir ítrekað milli lista og fylkja, mæltu þessar yfirferðir. Að stoppa fyrir dýra afhendingu gefur nákvæmar tölur fyrir ranga spurningu. Að margfalda þetta fylki skapar tímabundið niðurstöðu. Að bæta við upprunalegu gildunum skapar úttakið. Innfædd framkvæmd þarf enn minni og færir gögn.

3:47 Sumar aðgerðir taka við úttaksbuffer, sem minnkar úthlutanir þegar kóðinn þinn getur notað hann á öruggan hátt aftur. Ein falleg lína getur pantað nokkra stóra puffra. Python Speed bendir líka á þetta vandamál. Úthlutarinn er ótrúlega áhugalaus um fagurfræði þína.

Getur samsett Python lykkja líka verið hröð?

4:00 Þú getur líka haldið lykkjusetningu og breytt útfærslu hennar. Numba getur þýtt studdar tölulegar Python-aðgerðir í innfæddan kóða. Hér er lykkjan úr prófinu okkar með þýðanda skreytingu sinni. Það stendur ennþá for. Dýra leið túlkunnar hefur breyst. Eftir samsetningu tók þessi lykkja innan við hálfa millisekúndu með tilbúnum fylkjum. Samsetningin sjálf tók um eina sekúndu í þessari keyrslu. Sá uppsetningarkostnaður var undanskilinn endurteknum tímasetningum,

4:22 svo lítið einu sinni starf á skilið annan samanburð. Leiðbeiningar Numba sýna gjarnan skýrar lykkjur. Að hefja flutning tungumáls áður en fundin er heitur slóð er flókin leið til að forðast að opna prófílar. Fyrst skaltu finna hvað eyðir tímanum. Netbiðir, hlutaskönnun og magnreikningar krefjast mismunandi lagfæringa. Innfæddar fylkisaðgerðir hjálpa þegar útreikningur og gögn passa.

4:43 Mældu niðurstöðuna sem sá sem kallar á þig þarfnast í raun. Nú fyrir þennan flýtileið. Þú hefur Python fall og vilt að það taki við fylki. Vafningur að nafni vectorize hljómar eins og hnappurinn sem vantar til að auka frammistöðu. Skjöl hennar hafa mikilvæga setningu sem bíður.

Hvað framkvæmir np.vectorize raunverulega?

4:56 NumPy segir að vectorize vafningur þess sé aðallega veittur til þæginda. Útfærsla þess er í raun for lykkja. Vafningurinn tekur við lotum, en heldur áfram að kalla Python fallið þitt fyrir eftirfarandi þætti. Viðmótið styttist. Útfærslumörk héldust upptekin. Horfðu á sömu gildin koma aftur í gegnum Python "callback". Með tilbúnum fylkjum tók þessi útgáfa um áttatíu og sjö millisekúndur. Það var hægara en skilningurinn okkar.

5:18 Gagnlegur útbreiðsluvafningur getur varðveitt nákvæmlega þá vinnu á hvert stak sem þú varst að reyna að fjarlægja. Athugaðu útfærsluna á bak við lotuviðmót, haltu samhæfum gögnum í sínu nýtanlega formi og hafðu umbreytingu með í samanburðinum. Innfæddar, "callback" og samsettar lykkjur geta litið svipað út frá stól þess sem kallar. Nafnið vectorize gaf loforð sem skeiðklukkan þín aldrei undirritaði. Haltu henni ef þægindi er það sem þú þarfnast. Til að ná framúrskarandi árangri skaltu athuga lykkjuna sem keyrir.

Hvað ættir þú að breyta í kóðanum þínum?

5:41 Dómur minn er SHIP IT fyrir hópvinnslu mældrar tölulegrar hot path. Haltu venjulegum lykkjum þegar þær virka nú þegar vel. Athugaðu hvar verkið á sér stað og hvað næsti kallar þarfnast. Gerðu áskrifandi, ýttu á bjölluna og segðu mér í athugasemdum hvort þú hefðir stimplað hana öðruvísi. Og þetta er The Daily Diff í dag. Ég er Niko frá Axrisi. Sameinaðu á ábyrgan hátt.

Heimildir

  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

Tengd myndbönd