# Učinkovitost Pythona: zanke v izvornem jeziku NumPy, povratni klici in stroški pretvorbe

Published: 2026-10-17

Nadzorovan številski preizkus, ki uporablja samo CPU, sledi enakim vrednostim skozi zanke CPython, aritmetiko NumPy, ovijalnik povratnih klicev Python in prevedeno zanko Numba. NumPy s pripravljenim vhodom je imel veliko prednost, medtem ko je pretvorba iz in nazaj v sezname Python to prednost zmanjšala na skoraj neodločen rezultat. Epizoda pojasnjuje mejo izvajanja in kako izmeriti rezultat, ki ga aplikacija potrebuje.

Canonical: https://thedailydiff.dev/sl/video/2026-10-17-python-native-loops/

## Kaj zajema ta videoposnetek

- CPython prevaja izvorno kodo v bajtno kodo. Ponavljajoče se delo tolmača/objekta in tipizirana izvorna numerična zanka so različni načini izvajanja.
- Numerična aritmetika NumPy lahko posreduje tipizirane pakete prevedenim operacijam; aritmetična zanka še vedno obstaja, pogledi pa imajo lahko nezvezne postavitve.
- Izmerite stroške pretvorbe in zahtevane izhodne predstavitve. V tem zagonu je pretvorba seznamov Python v polja in nazaj izničila veliko prednost pripravljenega polja.
- Majhne delovne obremenitve lahko favorizirajo običajni Python, ker so fiksni stroški klicev polja pomembni. Razumevanje osmih vrednosti je zmagalo v tej izmerjeni primerjavi.
- np.vectorize je priročen ovijalnik, ki kliče Python za zaporedne elemente; samo vmesnik za pakete ne vzpostavlja izvornega numeričnega izvajanja.
- Prevedene zanke s sintakso Python so lahko tudi hitre. Vključite stroške hladnega prevajanja/nastavitve, kadar so pomembni za klicatelja.
- Izvorno izvajanje, CPU SIMD, večnitnost in zaledne komponente GPU so ločene ideje. Razpoložljive funkcije CPU ne sledijo navodilom, uporabljenim v določenem zagonu.

## Poglavja

- 0:00 Zakaj se lahko isti CPE konča prej?
- 0:52 Katerega dela se Python zanka ponavlja?
- 1:38 Kam premakne NumPy zanko?
- 2:13 Ali hitro pomeni GPU ali veliko jeder CPE?
- 2:49 Kdaj izgine impresivna pospešitev?
- 3:28 Katere meje sodijo v merilo uspešnosti?
- 4:00 Ali je lahko prevedena zanka Python tudi hitra?
- 4:56 Kaj dejansko izvaja np.vectorize?
- 5:41 Kaj bi morali spremeniti v svoji kodi?

## Preveden prepis

Prevedeno iz izvirnega angleškega pripovedovanja. Razpoložljivi zvok in podnapisi so nadzorovani s strani YouTuba.

### Zakaj se lahko isti CPE konča prej?

0:00 Misliš, da Python potrebuje nov jezik, da postane hiter. Isti CPE je naš paket pognal hitreje, ko se je zanka premaknila. Kam je šlo delo? Kdaj pospešitev izgine? Katera bližnjica vrne Python nazaj? To je The Daily Diff, pod pokrovom. Pazite na to bližnjico. CPython je standardna implementacija Pythona.

0:17 Vašo izvorno kodo prevede v bajtno kodo, nato pa ta navodila izvede v tolmaču. NumPy je numerična knjižnica, katere polja hranijo vrednosti z deklariranim tipom podatkov. Njegova vgrajena aritmetika lahko celoten paket posreduje prevedenim operacijam. Vzemite milijon plavajočih vrednosti, vsako kvadrirajte, nato dodajte prvotno vrednost. Vsaka različica dobi enake vrednosti in proizvede ujemajoče se odgovore. Vrednosti so dovolj majhne, da preprečijo razlike v zaokroževanju.

0:40 Na tem stroju je razumevanje trajalo približno triintrideset milisekund. NumPy je trajalo manj kot eno. Oboje je delovalo na CPE. To je uporaben dokaz za to delovno obremenitev in grozna osmrtnica za programski jezik. Začnite z navadno zanko.

### Katerega dela se Python zanka ponavlja?

0:53 Python dobi naslednjo vrednost, izvede aritmetiko in doda odgovor. Nato to ponovi. Množenje je poceni. Urejanje naslednjega množenja in obdelava objektov Python okoli njega vsakič doda delo. To je dejansko razstavljanje testirane funkcije. Iteracija, množenje in seštevanje se pojavijo kot navodila bajtne kode. Različice in tolmači Pythona se odločajo različno.

1:14 Ti časi pripadajo različici na zaslonu, ki je Python 3.10. Seznam Python hrani reference na objekte, tako da lahko različne vrste stvari delijo seznam. Naše aritmetično delo uporablja številke povsod. Plača za splošno ureditev, medtem ko zahteva ponavljajočo se storitev. Predstavljajte si, da milijonkrat naročite isto kavo in za vsako skodelico izpolnite nov obrazec. Kavni aparat je v redu.

1:36 Dokumentacija je razvila svojo kariero.

### Kam premakne NumPy zanko?

1:38 NumPy spremeni pogodbo. To polje vsebuje plavajoče vrednosti fiksne velikosti z enim deklariranim tipom. Naše polje je sosednje, zato njegove vrednosti sedijo skupaj v pomnilniku. Pogledi imajo lahko druge postavitve. Aritmetična operacija ve, kakšne podatke prejema. Klic posreduje paket izvorni operaciji. Zanka še vedno obišče vrednosti znotraj prevedene kode. Lahko ponovno uporabi poznavanje tipa pri tem delu.

2:00 Python ostaja oseba, ki oddaja delo. Itamar Turner Trauring razlaga razliko v Python Speed. Vmesniki za pakete, izvorne implementacije in vektorska navodila procesorja so ločene stvari. Ime funkcije daje zelo malo dokazov.

### Ali hitro pomeni GPU ali veliko jeder CPE?

2:13 Ta rezultat je uporabljal NumPy na CPE. Zaledna komponenta GPU, kot je CuPy, izbere drug dom za polja in operacije. Nakup GPU pusti to navadno zanko Python delovati tam, kjer je že delovala. Vektorska navodila CPE lahko obdelajo več vrednosti skupaj. NumPy ima mehanizme za izbiro podprtih jeder. Naš čas izvajanja poroča o razpoložljivih funkcijah, vendar ne sledi navodilom te izjave. Dodeljevanje celotnega izmerjenega dobička vektorskim navodilom bi preveč poudarilo dokaze.

2:40 Nakupovalni voziček za GPU lahko ostane zaprt. Nekaj je globoko zadovoljujočega pri popravku zmogljivosti, ki tudi prekliče nakup. Na žalost se merilo uspešnosti nadaljuje.

### Kdaj izgine impresivna pospešitev?

2:49 Z osmimi vrednostmi je zmagala razumljivost. Klicanje strojev polja je stalo več kot drobno opravilo. Večja pripravljena polja so prehitela. Uporabili smo ponavljajoče se poskuse in ogret proces. Novejše gradnje Pythona lahko spremenijo prehod. Nato spremenite, kaj aplikacija potrebuje. Začnite s seznamom Python in končajte z novim seznamom Python. NumPy mora vhod pretvoriti v polje in odgovor spremeniti nazaj v objekte

3:11 Python. Ti koraki sodijo na račun, če jih vaša aplikacija potrebuje. Pri milijonu vrednosti je celotna pot trajala približno osemindvajset milisekund. Razumevanje je trajalo tudi približno osemindvajset. Naša dramatična prednost je postala skoraj neodločen rezultat. Hitri del je bil resničen. Prednost je bila odvisna od ohranjanja podatkov v njihovi numerični obliki.

### Katere meje sodijo v merilo uspešnosti?

3:28 Sledite podatkom. Če naslednja operacija sprejme polje, obdržite polje. Če se večkrat pretvarjate med seznami in polji, izmerite te prehode. Ustavitev pred drago predajo daje natančne številke za napačno vprašanje. Množenje tega polja ustvari začasni rezultat. Dodajanje prvotnih vrednosti ustvari izhod. Izvorno izvajanje še vedno potrebuje pomnilnik in premika podatke.

3:47 Nekatere operacije sprejmejo izhodni medpomnilnik, kar zmanjša dodeljevanje, ko lahko vaša koda varno ponovno uporabi. Ena lepa vrstica lahko naroči več velikih medpomnilnikov. Python Speed opozarja tudi na to težavo. Dodeljevalec je izjemno ravnodušen do vaše estetike.

### Ali je lahko prevedena zanka Python tudi hitra?

4:00 Prav tako lahko ohranite sintakso zanke in spremenite njeno izvajanje. Numba lahko prevede podprte numerične funkcije Python v izvorno kodo. Tukaj je zanka iz našega preizkusa z njenim dekoratorjem prevajalnika. Še vedno piše 'for'. Draga pot tolmača se je spremenila. Po prevajanju je ta zanka trajala manj kot pol milisekunde s pripravljenimi polji. Samo prevajanje je v tem zagonu trajalo približno sekundo. Ti stroški nastavitve so bili izključeni iz ponovljenih časov,

4:22 zato si drobno enkratno delo zasluži drugačno primerjavo. Numba lasten vodnik z veseljem prikazuje eksplicitne zanke. Začeti migracijo jezika, preden najdete vroča pot je zapleten način za izogibanje odprtju profilerja. Najprej ugotovite, kaj porablja čas. Čakanje omrežja, razčlenjevanje objektov in množična aritmetika zahtevajo različne rešitve. Izvorne operacije polj pomagajo, ko se izračun in podatki ujemajo.

4:43 Izmerite rezultat, ki ga vaš klicatelj dejansko potrebuje. Sedaj pa še ta bližnjica. Imate funkcijo Python in želite, da sprejme polje. Ovijalnik z imenom vectorize zveni kot manjkajoči gumb za zmogljivost. Njegova dokumentacija ima pomembno čakajočo poved.

### Kaj dejansko izvaja np.vectorize?

4:56 NumPy pravi, da je njegov ovijalnik vectorize namenjen predvsem udobju. Njegova implementacija je v bistvu zanka for. Ovijalnik sprejema pakete, vendar še naprej kliče vašo funkcijo Python za zaporedne elemente. Vmesnik se je skrajšal. Meja izvajanja je ostala zasedena. Opazujte, kako se iste vrednosti vračajo skozi povratni klic Python. S pripravljenimi polji je ta različica trajala približno sedeminosemdeset milisekund. Bila je počasnejša od našega razumevanja.

5:18 Uporaben ovijalnik za oddajanje lahko ohrani natančno delo po elementih, ki ste ga poskušali odstraniti. Preverite implementacijo za paketnim vmesnikom, ohranite združljive podatke v njihovi uporabni obliki in vključite pretvorbo v primerjavo. Izvorne, povratne in prevedene zanke so lahko s stališča klicatelja podobne. Ime vectorize je dalo obljubo, ki je vaša štoparica nikoli ni podpisala. Obdržite ga, kadar je udobje tisto, kar potrebujete. Za zmogljivost preverite zanko, ki se izvaja.

### Kaj bi morali spremeniti v svoji kodi?

5:41 Moja sodba je SHIP IT za paketno obdelavo izmerjene numerične vroče poti. Obdržite navadne zanke, kadar že dobro delujejo. Preverite, kje se delo dogaja in kaj potrebuje naslednji klicatelj. Naročite se, pritisnite zvonček in mi v komentarjih povejte, če bi vi to označili drugače. In to je današnja razlika. Sem Niko iz Axrisi. Združite odgovorno.

## Viri

- [Universal functions (ufunc) basics — NumPy 2.2](https://numpy.org/doc/2.2/user/basics.ufuncs.html) — NumPy
- [The N-dimensional array — NumPy 2.2](https://numpy.org/doc/2.2/reference/arrays.ndarray.html) — NumPy
- [numpy.vectorize — convenience and performance notes](https://numpy.org/doc/2.2/reference/generated/numpy.vectorize.html) — NumPy
- [CPU/SIMD optimizations — NumPy 2.2](https://numpy.org/doc/2.2/reference/simd/index.html) — NumPy
- [dis — Disassembler for Python bytecode](https://docs.python.org/3.10/library/dis.html) — Python Software Foundation
- [CPython 3.10.12 list representation](https://github.com/python/cpython/blob/v3.10.12/Include/cpython/listobject.h) — CPython contributors
- [The limits of Python vectorization as a performance technique](https://pythonspeed.com/articles/vectorization-python-alternatives/) — Itamar Turner-Trauring / Python⇒Speed
- [Performance Tips](https://numba.readthedocs.io/en/stable/user/performance-tips.html) — Numba
- [Basics of CuPy](https://docs.cupy.dev/en/stable/user_guide/basic.html) — CuPy
