# Python-ydeevne: native NumPy-loops, callbacks og konverteringsomkostninger

Published: 2026-10-17

En kontrolleret CPU-kun numerisk test følger identiske værdier gennem CPython-loops, NumPy-aritmetik, en Python-callback-wrapper og en kompileret Numba-loop. Færdig-input NumPy havde et stort forspring, mens konvertering fra og tilbage til Python-lister reducerede den fordel til næsten uafgjort. Episoden forklarer udførelsesgrænsen og hvordan man måler det resultat, en applikation har brug for.

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

## Hvad denne video dækker

- CPython kompilerer kildekode til bytekode. Gentaget fortolker-/objektarbejde og en typet native numerisk loop er forskellige udførelsesarrangementer.
- Numerisk NumPy-aritmetik kan give typede batches til kompilerede operationer; den aritmetiske loop eksisterer stadig, og visninger kan have ikke-sammenhængende layouts.
- Mål konvertering og påkrævet outputrepræsentation. I denne kørsel fjernede konvertering af Python-lister til arrays og tilbage det store forspring for færdige arrays.
- Små arbejdsbyrder kan favorisere almindelig Python, fordi faste array-kaldsomkostninger betyder noget. Forståelsen med otte værdier vandt denne målte sammenligning.
- np.vectorize er en bekvemmeligheds-wrapper, der kalder Python for successive elementer; en batch-grænseflade alene etablerer ikke native numerisk udførelse.
- Kompilerede Python-syntax-loops kan også være hurtige. Inkluder kolde kompilerings-/opsætningsomkostninger, når de er vigtige for den kaldende.
- Native udførelse, CPU SIMD, multithreading og GPU-backends er separate ideer. Tilgængelige CPU-funktioner sporer ikke de instruktioner, der bruges i en bestemt kørsel.

## Kapitler

- 0:00 Hvorfor kan den samme CPU blive færdig før?
- 0:52 Hvilket arbejde gentager en Python-loop?
- 1:38 Hvor flytter NumPy loopen hen?
- 2:13 Betyder hurtig GPU eller mange CPU-kerner?
- 2:49 Hvornår forsvinder den imponerende hastighedsforøgelse?
- 3:28 Hvilke grænser hører til i benchmarken?
- 4:00 Kan en kompileret Python-loop også være hurtig?
- 4:56 Hvad udfører np.vectorize egentlig?
- 5:41 Hvad skal du ændre i din kode?

## Oversat udskrift

Oversat fra den originale engelske fortælling. Tilgængelig lyd og undertekster styres af YouTube.

### Hvorfor kan den samme CPU blive færdig før?

0:00 Du tror, Python har brug for et nyt sprog for at blive hurtigt. Den samme CPU kørte vores batch hurtigere, efter at loopen flyttede. Hvor blev arbejdet af? Hvornår forsvinder hastighedsforøgelsen? Hvilken genvej bringer Python tilbage? Dette er The Daily Diff, under overfladen. Hold øje med den genvej. CPython er standardimplementeringen af Python.

0:17 Den kompilerer din kildekode til bytekode og kører derefter disse instruktioner i en fortolker. NumPy er et numerisk bibliotek, hvis arrays indeholder værdier med en deklareret datatype. Dets indbyggede aritmetik kan give en hel batch til kompilerede operationer. Tag en million flydende kommatalsværdier, kvadrer hver enkelt, tilføj derefter den originale værdi. Hver version får identiske værdier og producerer matchende svar. Værdierne er små nok til at holde afrundingsforskelle ude af løbet.

0:40 På denne maskine tog forståelsen omkring treogtredive millisekunder. NumPy tog mindre end ét. Begge kørte på CPU'en. Det er nyttig dokumentation for denne arbejdsbyrde og en frygtelig nekrolog for et programmeringssprog. Start med den almindelige loop.

### Hvilket arbejde gentager en Python-loop?

0:53 Python får den næste værdi, udfører aritmetikken og tilføjer svaret. Så gør den det igen. Multiplikationen er billig. Arrangering af den næste multiplikation og håndtering af Python-objekterne omkring den tilføjer arbejde hver gang. Dette er den testede funktions faktiske disassemblering. Iteration, multiplikation og addition fremstår som bytekodeinstruktioner. Python-versioner og fortolkere træffer forskellige valg.

1:14 Disse tider tilhører versionen på skærmen, som er Python tre komma ti. En Python-liste gemmer referencer til objekter, så forskellige slags ting kan dele en liste. Vores aritmetiske job bruger tal hele vejen igennem. Det betaler for et generelt arrangement, mens det anmoder om en gentagen service. Forestil dig at bestille den samme kaffe en million gange og udfylde en frisk formular for hver kop. Kaffemaskinen er fin.

1:36 Papirarbejdet har udviklet sin egen karriere.

### Hvor flytter NumPy loopen hen?

1:38 NumPy ændrer kontrakten. Dette array indeholder flydende kommatalsværdier af fast størrelse med en deklareret type. Vores array er sammenhængende, så dets værdier sidder sammen i hukommelsen. Visninger kan have andre layouts. Den aritmetiske operation ved, hvilken slags data den modtager. Kaldet giver batchen til en native operation. En loop besøger stadig værdierne inde i kompileret kode. Den kan genbruge viden om typen på tværs af dette arbejde.

2:00 Python forbliver den person, der overdrager opgaven. Itamar Turner Trauring forklarer forskellen i Python Speed. Batch-grænseflader, native implementeringer og processorvektorinstruktioner er separate ting. Funktionsnavnet giver meget lidt bevis.

### Betyder hurtig GPU eller mange CPU-kerner?

2:13 Dette resultat brugte NumPy på CPU'en. En GPU-backend som CuPy vælger et andet hjem for arrays og operationer. At købe en GPU lader denne almindelige Python-loop køre, hvor den allerede kørte. CPU-vektorinstruktioner kan behandle flere værdier sammen. NumPy har mekanismer til at vælge understøttede kerner. Vores runtime rapporterer tilgængelige funktioner, men sporer ikke denne expressions instruktioner. At give hele den målte gevinst til vektorinstruktioner ville oversælge beviserne.

2:40 GPU-indkøbskurven kan forblive lukket. Der er noget dybt tilfredsstillende ved en ydelsesfik, der også annullerer et køb. Desværre fortsætter benchmarken.

### Hvornår forsvinder den imponerende hastighedsforøgelse?

2:49 Med otte værdier vandt forståelsen. At kalde array-maskineriet kostede mere end den lille opgave. Større færdige arrays trak foran. Vi brugte gentagne forsøg og en opvarmet proces. Nyere Python-builds kan ændre krydset. Så ændre, hvad applikationen har brug for. Begynd med en Python-liste og slut med en frisk Python-liste. NumPy skal konvertere input til et array og omdanne svaret tilbage til Python-

3:11 objekter. Disse trin hører med på regningen, hvis din applikation har brug for dem. Ved en million værdier tog den komplette sti omkring otteogtyve millisekunder. Forståelsen tog også omkring otteogtyve. Vores dramatiske forspring blev næsten uafgjort. Den hurtige del var reel. Fordelen afhang af at lade dataene forblive i deres numeriske form.

### Hvilke grænser hører til i benchmarken?

3:28 Følg dataene. Hvis den næste operation accepterer et array, behold arrayet. Hvis du gentagne gange konverterer mellem lister og arrays, mål disse krydsninger. At stoppe før en dyr overdragelse giver nøjagtige tal for det forkerte spørgsmål. At multiplicere dette array skaber et midlertidigt resultat. At tilføje de originale værdier skaber outputtet. Native udførelse kræver stadig hukommelse og flytter data.

3:47 Nogle operationer accepterer en outputbuffer, hvilket reducerer allokeringer, når din kode kan sikkert genbruge den. Én smuk linje kan bestille flere store buffere. Python Speed påpeger også dette problem. Allokatoren er bemærkelsesværdigt ligeglad med din æstetik.

### Kan en kompileret Python-loop også være hurtig?

4:00 Du kan også beholde loop-syntax og ændre dens udførelse. Numba kan kompilere understøttede numeriske Python-funktioner til native kode. Her er loopen fra vores test med dens compiler-decorator. Den siger stadig for. Den dyre fortolkersti er ændret. Efter kompilering tog denne loop mindre end et halvt millisekund med færdige arrays. Kompilering i sig selv tog omkring et sekund i denne kørsel. Disse opsætningsomkostninger var udelukket fra de gentagne tider,

4:22 så et lille engangsjob fortjener en anden sammenligning. Numbas egen guide viser gerne eksplicitte loops. At starte en sprogmigration, før man finder den hot path, er en omstændelig måde at undgå at åbne en profiler. Find først, hvad der forbruger tiden. Netværksventetider, objektparsing og bulk-aritmetik kræver forskellige løsninger. Native array-operationer hjælper, når beregningen og dataene passer.

4:43 Mål det resultat, din kaldende faktisk har brug for. Nu til den genvej. Du har en Python-funktion og vil have den til at acceptere et array. En wrapper kaldet vectorize lyder som den manglende ydelsesknap. Dens dokumentation har en vigtig sætning, der venter.

### Hvad udfører np.vectorize egentlig?

4:56 NumPy siger, at dens vectorize-wrapper primært er tilgængelig for bekvemmelighed. Dens implementering er i det væsentlige en for-loop. Wrapperen accepterer batches, men fortsætter med at kalde din Python-funktion for successive elementer. Grænsefladen blev kortere. Udførelsesgrænsen forblev travl. Se de samme værdier komme tilbage gennem Python-callbacken. Med færdige arrays tog denne version omkring syvogtredive millisekunder. Den var langsommere end vores forståelse.

5:18 En nyttig broadcasting-wrapper kan bevare det nøjagtige arbejde pr. element, du forsøgte at fjerne. Kontroller implementeringen bag en batch-grænseflade, opbevar kompatible data i dens nyttige form, og inkluder konvertering i sammenligningen. Native, callback og kompilerede loops kan se ens ud fra den kaldendes stol. Navnet vectorize afgav et løfte, som dit stopur aldrig underskrev. Behold den, når bekvemmelighed er, hvad du har brug for. For ydeevne skal du kontrollere den loop, der kører.

### Hvad skal du ændre i din kode?

5:41 Min dom er SHIP IT for batching af en målt numerisk hot path. Behold almindelige loops, når de allerede fungerer godt. Kontroller, hvor arbejdet foregår, og hvad den næste kaldende har brug for. Abonner, tryk på klokken, og fortæl mig i kommentarerne, om du ville have stemplet det anderledes. Og det var forskellen for i dag. Jeg er Niko fra Axrisi. Flet ansvarligt.

## Kilder

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