# Python-Performance: Native NumPy-Schleifen, Callbacks und Konvertierungskosten

Published: 2026-10-17

Ein kontrollierter numerischer CPU-Test verfolgt identische Werte durch CPython-Schleifen, NumPy-Arithmetik, einen Python-Callback-Wrapper und eine kompilierte Numba-Schleife. Bereitgestelltes NumPy hatte einen großen Vorsprung, während die Konvertierung von und zu Python-Listen diesen Vorteil auf ein annäherndes Unentschieden reduzierte. Die Episode erklärt die Ausführungsgrenze und wie das Ergebnis gemessen wird, das eine Anwendung benötigt.

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

## Was dieses Video behandelt

- CPython kompiliert den Quellcode zu Bytecode. Wiederholte Interpreter-/Objektarbeit und eine typisierte native numerische Schleife sind unterschiedliche Ausführungsanordnungen.
- Numerische NumPy-Arithmetik kann typisierte Batches an kompilierte Operationen übergeben; die arithmetische Schleife existiert weiterhin, und Views können nicht-zusammenhängende Layouts haben.
- Messen Sie die Konvertierung und die erforderliche Ausgabedarstellung. In diesem Lauf eliminierte die Konvertierung von Python-Listen in Arrays und zurück den großen Vorsprung des fertigen Arrays.
- Kleine Arbeitslasten können normales Python bevorzugen, da feste Array-Aufrufkosten eine Rolle spielen. Die acht-Werte-Komprehension gewann diesen gemessenen Vergleich.
- np.vectorize ist ein Convenience-Wrapper, der Python für aufeinanderfolgende Elemente aufruft; eine Batch-Schnittstelle allein stellt keine native numerische Ausführung her.
- Kompilierte Python-Syntax-Schleifen können ebenfalls schnell sein. Berücksichtigen Sie die Kosten für die Kaltkompilierung/Einrichtung, wenn sie für den Aufrufer relevant sind.
- Native Ausführung, CPU-SIMD, Multithreading und GPU-Backends sind separate Konzepte. Verfügbare CPU-Funktionen verfolgen nicht die in einem bestimmten Durchlauf verwendeten Anweisungen.

## Kapitel

- 0:00 Warum kann dieselbe CPU schneller fertig sein?
- 0:52 Welche Arbeit wiederholt eine Python-Schleife?
- 1:38 Wohin verschiebt NumPy die Schleife?
- 2:13 Bedeutet schnell GPU oder viele CPU-Kerne?
- 2:49 Wann verschwindet der beeindruckende Geschwindigkeitsgewinn?
- 3:28 Welche Grenzen gehören in den Benchmark?
- 4:00 Kann eine kompilierte Python-Schleife auch schnell sein?
- 4:56 Was führt np.vectorize tatsächlich aus?
- 5:41 Was sollten Sie in Ihrem Code ändern?

## Übersetztes Transkript

Aus der englischen Originalerzählung übersetzt. Verfügbare Audio- und Untertitel werden von YouTube gesteuert.

### Warum kann dieselbe CPU schneller fertig sein?

0:00 Sie denken, Python braucht eine neue Sprache, um schnell zu werden. Dieselbe CPU hat unseren Batch schneller ausgeführt, nachdem die Schleife verschoben wurde. Wohin ist die Arbeit gegangen? Wann verschwindet die Beschleunigung? Welcher Shortcut bringt Python zurück? Das ist The Daily Diff, unter der Haube. Behalten Sie diesen Shortcut im Auge. CPython ist die Standard-Python-Implementierung.

0:17 Es kompiliert Ihren Quellcode in Bytecode und führt diese Anweisungen dann in einem Interpreter aus. NumPy ist eine numerische Bibliothek, deren Arrays Werte mit einem deklarierten Datentyp enthalten. Seine integrierte Arithmetik kann einen ganzen Batch an kompilierte Operationen übergeben. Nehmen Sie eine Million Gleitkommawerte, quadrieren Sie jeden einzelnen, dann addieren Sie den ursprünglichen Wert. Jede Version erhält identische Werte und liefert übereinstimmende Antworten. Die Werte sind klein genug, um Rundungsdifferenzen aus dem Rennen zu halten.

0:40 Auf dieser Maschine dauerte die Komprehension etwa dreiunddreißig Millisekunden. NumPy brauchte weniger als eine. Beide liefen auf der CPU. Das ist ein nützlicher Beweis für diese Arbeitslast und ein schrecklicher Nachruf für eine Programmiersprache. Beginnen Sie mit der gewöhnlichen Schleife.

### Welche Arbeit wiederholt eine Python-Schleife?

0:53 Python erhält den nächsten Wert, führt die Arithmetik aus und hängt die Antwort an. Dann tut es das wieder. Die Multiplikation ist günstig. Die Vorbereitung der nächsten Multiplikation und die Handhabung der Python-Objekte darum herum fügt jedes Mal Arbeit hinzu. Dies ist die tatsächliche Disassemblierung der getesteten Funktion. Iteration, Multiplikation und Addition erscheinen als Bytecode-Anweisungen. Python-Versionen und -Interpreter treffen unterschiedliche Entscheidungen.

1:14 Diese Zeiten gehören der Version auf dem Bildschirm, die Python 3.10 ist. Eine Python-Liste speichert Referenzen auf Objekte, sodass verschiedene Arten von Dingen eine Liste teilen können. Unsere Rechenaufgabe verwendet durchgehend Zahlen. Es bezahlt für eine allgemeine Anordnung, während es einen sich wiederholenden Dienst anfordert. Stellen Sie sich vor, Sie bestellen millionenfach denselben Kaffee und füllen für jede Tasse ein neues Formular aus. Die Kaffeemaschine ist in Ordnung.

1:36 Die Bürokratie hat eine eigene Karriere entwickelt.

### Wohin verschiebt NumPy die Schleife?

1:38 NumPy ändert den Vertrag. Dieses Array enthält Gleitkommawerte fester Größe mit einem deklarierten Typ. Unser Array ist zusammenhängend, sodass seine Werte im Speicher zusammenliegen. Views können andere Layouts haben. Die arithmetische Operation weiß, welche Art von Daten sie empfängt. Der Aufruf übergibt den Batch an eine native Operation. Eine Schleife durchläuft die Werte immer noch im kompilierten Code. Sie kann das Wissen über den Typ während dieser Arbeit wiederverwenden.

2:00 Python bleibt die Person, die den Auftrag übergibt. Itamar Turner Trauring erklärt den Unterschied in Python Speed. Batch-Schnittstellen, native Implementierungen und Prozessorvektoranweisungen sind separate Dinge. Der Funktionsname liefert nur sehr wenige Beweise.

### Bedeutet schnell GPU oder viele CPU-Kerne?

2:13 Dieses Ergebnis verwendete NumPy auf der CPU. Ein GPU-Backend wie CuPy wählt einen anderen Ort für Arrays und Operationen. Der Kauf einer GPU lässt diese gewöhnliche Python-Schleife dort laufen, wo sie bereits lief. CPU-Vektoranweisungen können mehrere Werte zusammen verarbeiten. NumPy verfügt über Mechanismen zur Auswahl unterstützter Kernels. Unsere Laufzeit meldet verfügbare Funktionen, verfolgt aber die Anweisungen dieser Expression nicht. Den gesamten gemessenen Gewinn den Vektoranweisungen zuzuschreiben, würde die Beweise überbewerten.

2:40 Der GPU-Warenkorb kann geschlossen bleiben. Es ist zutiefst befriedigend, wenn eine Performance-Korrektur auch einen Kauf annulliert. Leider geht der Benchmark weiter.

### Wann verschwindet der beeindruckende Geschwindigkeitsgewinn?

2:49 Bei acht Werten gewann die Komprehension. Das Aufrufen der Array-Maschinerie kostete mehr als die winzige Aufgabe. Größere, fertige Arrays zogen in Führung. Wir verwendeten wiederholte Versuche und einen aufgewärmten Prozess. Neuere Python-Builds können den Übergang ändern. Dann ändern Sie, was die Anwendung benötigt. Beginnen Sie mit einer Python-Liste und beenden Sie mit einer neuen Python-Liste. NumPy muss die Eingabe in ein Array konvertieren und die Antwort zurück in Python-Objekte

3:11 umwandeln. Diese Schritte gehören auf die Rechnung, wenn Ihre Anwendung sie benötigt. Bei einer Million Werten dauerte dieser vollständige Pfad etwa achtundzwanzig Millisekunden. Die Komprehension dauerte ebenfalls etwa achtundzwanzig. Unser dramatischer Vorsprung wurde zu einem annähernden Unentschieden. Der schnelle Teil war real. Der Vorteil hing davon ab, die Daten in ihrer numerischen Form zu belassen.

### Welche Grenzen gehören in den Benchmark?

3:28 Folgen Sie den Daten. Wenn die nächste Operation ein Array akzeptiert, behalten Sie das Array. Wenn Sie wiederholt zwischen Listen und Arrays konvertieren, messen Sie diese Übergänge. Das Anhalten vor einer teuren Übergabe liefert genaue Zahlen für die falsche Frage. Das Multiplizieren dieses Arrays erzeugt ein temporäres Ergebnis. Das Addieren der ursprünglichen Werte erzeugt die Ausgabe. Native Ausführung benötigt immer noch Speicher und verschiebt Daten.

3:47 Einige Operationen akzeptieren einen Ausgabepuffer, wodurch die Allokationen reduziert werden, wenn Ihr Code ihn sicher wiederverwenden kann. Eine einzige hübsche Zeile kann mehrere große Puffer bestellen. Python Speed weist auch auf dieses Problem hin. Der Allokator ist Ihrer Ästhetik gegenüber bemerkenswert gleichgültig.

### Kann eine kompilierte Python-Schleife auch schnell sein?

4:00 Sie können auch die Schleifensyntax beibehalten und ihre Ausführung ändern. Numba kann unterstützte numerische Python-Funktionen in nativen Code kompilieren. Hier ist die Schleife aus unserem Test mit ihrem Compiler-Decorator. Es steht immer noch 'for'. Der teure Interpreterpfad hat sich geändert. Nach der Kompilierung dauerte diese Schleife mit fertigen Arrays weniger als eine halbe Millisekunde. Die Kompilierung selbst dauerte in diesem Lauf etwa eine Sekunde. Diese Einrichtungskosten wurden von den wiederholten Zeitmessungen ausgeschlossen,

4:22 sodass eine winzige einmalige Aufgabe einen anderen Vergleich verdient. Numbs eigener Leitfaden zeigt gerne explizite Schleifen. Eine Sprachmigration zu beginnen, bevor der Hot Path gefunden wird, ist eine aufwendige Art, das Öffnen eines Profilers zu vermeiden. Finden Sie zuerst, was die Zeit verbraucht. Netzwerkwarten, Objekt-Parsing und Massenarithmetik erfordern unterschiedliche Korrekturen. Native Array-Operationen helfen, wenn die Berechnung und die Daten passen.

4:43 Messen Sie das Ergebnis, das Ihr Aufrufer tatsächlich benötigt. Nun zu diesem Shortcut. Sie haben eine Python-Funktion und möchten, dass sie ein Array akzeptiert. Ein Wrapper namens 'vectorize' klingt wie der fehlende Performance-Knopf. Seine Dokumentation enthält einen wichtigen Satz.

### Was führt np.vectorize tatsächlich aus?

4:56 NumPy sagt, sein vectorize-Wrapper wird primär aus Bequemlichkeit bereitgestellt. Seine Implementierung ist im Wesentlichen eine for-Schleife. Der Wrapper akzeptiert Batches, ruft aber weiterhin Ihre Python-Funktion für aufeinanderfolgende Elemente auf. Die Schnittstelle wurde kürzer. Die Ausführungsgrenze blieb ausgelastet. Beobachten Sie, wie dieselben Werte über den Python-Callback zurückkommen. Mit fertigen Arrays dauerte diese Version etwa siebenundachtzig Millisekunden. Sie war langsamer als unsere Komprehension.

5:18 Ein nützlicher Broadcasting-Wrapper kann die genaue Arbeit pro Element beibehalten, die Sie versucht haben zu entfernen. Überprüfen Sie die Implementierung hinter einer Batch-Schnittstelle, bewahren Sie kompatible Daten in ihrer nützlichen Form auf und beziehen Sie die Konvertierung in den Vergleich ein. Native, Callback- und kompilierte Schleifen können vom Aufrufer aus ähnlich aussehen. Der Name 'vectorize' gab ein Versprechen ab, das Ihre Stoppuhr nie unterschrieben hat. Behalten Sie es bei, wenn Bequemlichkeit das ist, was Sie brauchen. Für die Performance überprüfen Sie die Schleife, die läuft.

### Was sollten Sie in Ihrem Code ändern?

5:41 Mein Urteil ist 'ship it' für das Batching eines gemessenen numerischen Hot Paths. Behalten Sie gewöhnliche Schleifen bei, wenn sie bereits gut funktionieren. Überprüfen Sie, wo die Arbeit stattfindet und was der nächste Aufrufer benötigt. Abonnieren Sie, drücken Sie die Glocke und sagen Sie mir in den Kommentaren, ob Sie es anders gestempelt hätten. Und das ist der Unterschied für heute. Ich bin Niko von Axrisi. Verantwortungsbewusst zusammenführen.

## Quellen

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