# Výkon Pythonu: natívne slučky NumPy, spätné volania a náklady na konverziu

Published: 2026-10-17

Kontrolovaný numerický test len pre CPU sleduje identické hodnoty prostredníctvom slučiek CPython, aritmetiky NumPy, obalovača spätných volaní Pythonu a kompilovanej slučky Numba. NumPy s hotovým vstupom mal veľký náskok, zatiaľ čo konverzia z a späť na zoznamy Pythonu znížila túto výhodu na takmer remízu. Epizóda vysvetľuje hranicu vykonávania a ako merať výsledok, ktorý aplikácia potrebuje.

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

## Čo toto video pokrýva

- CPython kompiluje zdrojový kód na bajtkód. Opakovaná práca interpretéra/objektu a typovaná natívna numerická slučka sú rôzne usporiadania vykonávania.
- Numerická aritmetika NumPy môže odovzdať typované dávky kompilovaným operáciám; aritmetická slučka stále existuje a zobrazenia môžu mať nesúvislé rozloženia.
- Zmerajte konverziu a požadovanú reprezentáciu výstupu. V tomto behu konverzia zoznamov Pythonu na polia a späť vymazala veľký náskok hotového poľa.
- Malé pracovné zaťaženia môžu uprednostňovať obyčajný Python, pretože pevné náklady na volanie polí sú dôležité. Osemhodnotová komprehenzia vyhrala toto merané porovnanie.
- np.vectorize je obalovač pre pohodlie, ktorý volá Python pre nasledujúce prvky; samotné dávkové rozhranie nezaručuje natívne numerické vykonávanie.
- Kompilované slučky so syntaxou Pythonu môžu byť tiež rýchle. Zahrňte náklady na studenú kompiláciu/nastavenie, keď sú dôležité pre volajúceho.
- Natívne vykonávanie, CPU SIMD, viacvláknové spracovanie a GPU backendy sú samostatné myšlienky. Dostupné funkcie CPU nesledujú inštrukcie použité v konkrétnom behu.

## Kapitoly

- 0:00 Prečo môže rovnaký CPU skončiť skôr?
- 0:52 Akú prácu opakuje slučka Pythonu?
- 1:38 Kam NumPy presunie slučku?
- 2:13 Znamená rýchlo GPU alebo veľa jadier CPU?
- 2:49 Kedy pôsobivé zrýchlenie zmizne?
- 3:28 Ktoré hranice patria do benchmarku?
- 4:00 Môže byť aj kompilovaná slučka Pythonu rýchla?
- 4:56 Čo vlastne vykonáva np.vectorize?
- 5:41 Čo by ste mali zmeniť vo svojom kóde?

## Preložený prepis

Preložené z pôvodného anglického rozprávania. Dostupný zvuk a titulky sú kontrolované službou YouTube.

### Prečo môže rovnaký CPU skončiť skôr?

0:00 Myslíte si, že Python potrebuje nový jazyk, aby bol rýchly. Rovnaký procesor spustil našu dávku rýchlejšie po presunutí slučky. Kam sa práca podela? Kedy zmizne zrýchlenie? Ktorá skratka privedie Python späť? Toto je The Daily Diff, pod kapotou. Dávajte pozor na tú skratku. CPython je štandardná implementácia Pythonu.

0:17 Kompiluje váš zdrojový kód do bajtkódu a potom spúšťa tieto inštrukcie v interpretovi. NumPy je numerická knižnica, ktorej polia uchovávajú hodnoty s deklarovaným dátovým typom. Jeho vstavaná aritmetika môže odovzdať celú dávku kompilovaným operáciám. Vezmite milión hodnôt s pohyblivou desatinnou čiarkou, umocnite každú z nich, potom pridajte pôvodnú hodnotu. Každá verzia dostane identické hodnoty a produkuje zhodné výsledky. Hodnoty sú dostatočne malé na to, aby sa rozdiely v zaokrúhľovaní nedostali do pretekov.

0:40 Na tomto stroji trvalo zrýchlenie asi tridsaťtri milisekúnd. NumPy trvalo menej ako jednu. Obidve bežali na CPU. To je užitočný dôkaz pre túto pracovnú záťaž a hrozná smrť pre programovací jazyk. Začnite s obyčajnou slučkou.

### Akú prácu opakuje slučka Pythonu?

0:53 Python získa ďalšiu hodnotu, vykoná aritmetiku a pripojí odpoveď. Potom to urobí znova. Násobenie je lacné. Usporiadanie ďalšieho násobenia a spracovanie objektov Pythonu okolo neho, pridáva prácu zakaždým. Toto je skutočná dekompilácia testovanej funkcie. Iterácia, násobenie a sčítanie sa zobrazujú ako bajtkódové inštrukcie. Verzie a interpretery Pythonu robia rôzne rozhodnutia.

1:14 Tieto časy patria verzii na obrazovke, ktorá je Python tri bod desať. Zoznam Pythonu ukladá odkazy na objekty, takže rôzne typy vecí môžu zdieľať zoznam. Naša aritmetická úloha používa čísla po celý čas. Platí za všeobecné usporiadanie, zatiaľ čo požaduje opakovanú službu. Predstavte si, že si objednáte rovnakú kávu miliónkrát a vyplníte nový formulár pre každú šálku. Kávovar je v poriadku.

1:36 Administratíva si vyvinula vlastnú kariéru.

### Kam NumPy presunie slučku?

1:38 NumPy mení zmluvu. Toto pole obsahuje hodnoty s pevnou veľkosťou s pohyblivou desatinnou čiarkou s jedným deklarovaným typom. Naše pole je súvislé, takže jeho hodnoty sedia spolu v pamäti. Zobrazenia môžu mať iné rozloženia. Aritmetická operácia vie, aký typ dát prijíma. Volanie odovzdá dávku natívnej operácii. Slučka stále navštevuje hodnoty vo vnútri kompilovaného kódu. Môže opätovne použiť znalosti o type v rámci tejto práce.

2:00 Python zostáva osobou, ktorá odovzdáva prácu. Itamar Turner Trauring vysvetľuje rozdiel v Python Speed. Dávkové rozhrania, natívne implementácie a vektorové inštrukcie procesora sú samostatné veci. Názov funkcie poskytuje veľmi málo dôkazov.

### Znamená rýchlo GPU alebo veľa jadier CPU?

2:13 Tento výsledok použil NumPy na CPU. GPU backend, ako je CuPy, vyberá iné umiestnenie pre polia a operácie. Kúpa GPU ponecháva túto obyčajnú slučku Pythonu bežať tam, kde už bežala. Vektorové inštrukcie CPU môžu spracovať niekoľko hodnôt naraz. NumPy má mechanizmy na výber podporovaných jadier. Náš runtime hlási dostupné funkcie, ale nesleduje inštrukcie tohto výrazu. Pripísať celý nameraný zisk vektorovým inštrukciám by preháňalo dôkazy.

2:40 Nákupný košík GPU môže zostať zatvorený. Na riešení výkonu, ktoré zároveň ruší nákup, je niečo hlboko uspokojujúce. Bohužiaľ, benchmark pokračuje.

### Kedy pôsobivé zrýchlenie zmizne?

2:49 Pri ôsmich hodnotách vyhralo zrýchlenie. Volanie mechanizmu poľa stálo viac ako malá úloha. Väčšie pripravené polia sa dostali dopredu. Použili sme opakované pokusy a zahriaty proces. Novšie zostavy Pythonu môžu zmeniť prechod. Potom zmeňte to, čo aplikácia potrebuje. Začnite so zoznamom Pythonu a skončite s novým zoznamom Pythonu. NumPy musí previesť vstup do poľa a zmeniť odpoveď späť na objekty Pythonu.

3:11 Tieto kroky patria na účet, ak ich vaša aplikácia potrebuje. Pri milióne hodnôt trvala táto kompletná cesta asi dvadsaťosem milisekúnd. Zrýchlenie trvalo tiež asi dvadsaťosem. Náš dramatický náskok sa stal takmer remízou. Rýchla časť bola skutočná. Výhoda závisela od toho, že dáta zostali vo svojej numerickej forme.

### Ktoré hranice patria do benchmarku?

3:28 Sledujte dáta. Ak ďalšia operácia prijíma pole, ponechajte pole. Ak opakovane konvertujete medzi zoznamami a poľami, zmerajte tieto prechody. Zastavenie pred drahou odovzdávkou poskytuje presné čísla pre nesprávnu otázku. Násobenie tohto poľa vytvára dočasný výsledok. Pridanie pôvodných hodnôt vytvára výstup. Natívne vykonávanie stále potrebuje pamäť a presúva dáta.

3:47 Niektoré operácie akceptujú výstupný buffer, čím znižujú alokácie, keď váš kód môže bezpečne ho opätovne použiť. Jedna pekná línia môže objednať niekoľko veľkých bufferov. Aj Python Speed upozorňuje na tento problém. Alokátor je pozoruhodne ľahostajný k vašej estetike.

### Môže byť aj kompilovaná slučka Pythonu rýchla?

4:00 Môžete tiež zachovať syntax slučky a zmeniť jej vykonávanie. Numba dokáže kompilovať podporované numerické funkcie Pythonu do natívneho kódu. Tu je slučka z nášho testu s jej kompilátorovým dekorátorom. Stále hovorí for. Drahá cesta interpretéra sa zmenila. Po kompilácii trvala táto slučka menej ako pol milisekundy s pripravenými poľami. Samotná kompilácia trvala v tomto behu asi sekundu. Tieto náklady na nastavenie boli vylúčené z opakovaných meraní,

4:22 takže malá jednorazová úloha si zaslúži iné porovnanie. Vlastný sprievodca Numba rád ukazuje explicitné slučky. Začatie migrácie jazyka pred nájdením horúcej cesty je prepracovaný spôsob, ako vyhnúť sa otvoreniu profilera. Najprv zistite, čo spotrebúva čas. Čakanie na sieť, parsovanie objektov a hromadná aritmetika si vyžadujú rôzne riešenia. Natívne operácie s poľami pomôžu, keď sa výpočet a dáta hodia.

4:43 Zmerajte výsledok, ktorý váš volajúci skutočne potrebuje. Teraz k tej skratke. Máte funkciu Pythonu a chcete, aby prijímala pole. Obalovač s názvom vectorize znie ako chýbajúce tlačidlo výkonu. Jeho dokumentácia má dôležitú vetu, ktorá čaká.

### Čo vlastne vykonáva np.vectorize?

4:56 NumPy hovorí, že jeho obalovač vectorize je poskytovaný primárne pre pohodlie. Jeho implementácia je v podstate slučka for. Obalovač prijíma dávky, ale naďalej volá vašu funkciu Pythonu pre postupné prvky. Rozhranie sa skrátilo. Hranica vykonávania zostala zaneprázdnená. Sledujte, ako sa tie isté hodnoty vracajú cez spätné volanie Pythonu. S pripravenými poľami trvala táto verzia asi osemdesiat sedem milisekúnd. Bola pomalšia ako naše zrýchlenie.

5:18 Užitočný obalovač pre vysielanie môže zachovať presnú prácu na prvok, ktorú ste sa snažili odstrániť. Skontrolujte implementáciu za dávkovým rozhraním, udržujte kompatibilné dáta v ich užitočnej forme a zahrňte konverziu do porovnania. Natívne, spätné volania a kompilované slučky môžu vyzerať podobne z pohľadu volajúceho. Názov vectorize urobil sľub, ktorý vaše stopky nikdy nepodpísali. Použite ho, keď potrebujete pohodlie. Pre výkon skontrolujte, ktorá slučka beží.

### Čo by ste mali zmeniť vo svojom kóde?

5:41 Môj verdikt je SHIP IT pre dávkové spracovanie meranej numerickej horúcej cesty. Ponechajte obyčajné slučky, ak už fungujú dobre. Skontrolujte, kde sa práca deje a čo potrebuje ďalší volajúci. Prihláste sa na odber, stlačte zvonček a povedzte mi v komentároch, či by ste to označili inak. A to je pre dnešok rozdiel. Som Niko z Axrisi. Zlučujte zodpovedne.

## Zdroje

- [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
