Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Vektorisierung statt Schleife

Nach dieser Lektion: Ich kann eine Schleife über eine Liste durch eine einzige Operation auf alle Elemente ersetzen.

Lektion, 55 Min.3 BefehleParallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Eine Operation auf allen Werten gleichzeitig

Vektorisierung heißt, denselben Rechenschritt in einem einzigen Aufruf auf ein ganzes Feld von Zahlen anzuwenden, statt Wert für Wert in einer Schleife. Auf diesem Modell beruhen Bibliotheken wie NumPy und jede GPU.

Ein Fotolabor erhöht die Helligkeit von zwölf Millionen Bildpunkten um denselben Betrag. Kein Bildpunkt hängt vom anderen ab, also muss keiner warten.

Am Ende dieser Lektion

Notiz

Ich kann eine Schleife über eine Liste durch eine einzige Operation auf alle Elemente ersetzen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Feldviele Zahlen gleicher Art in einer festen Reihenfolge (Array)
Elementweisejede Position für sich, mit der Position gegenübera[0] + b[0]
Vektorisierungeine Operation auf ein ganzes Feld statt einer Schleife
NumPyeine Python-Bibliothek zum Rechnen mit Feldern
Datenparalleljedes Element wird unabhängig von den anderen bearbeitet

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Schleife bearbeitet ein Element nach dem anderen

In einer Schleife nimmt Python einen Wert, rechnet und geht zum nächsten. Jeder Durchlauf ist mindestens ein Python-Schritt.

Der Code zählt sie mit: Pro Zahl sind es zwei, ein Multiplizieren und ein Addieren.

Quadratsumme mit Schleife und Schrittzähler

Code: python
# Quadratsumme von 1 bis n, Wert fuer Wert in einer Schleife.
n = 10
summe = 0
operationen = 0
for zahl in range(1, n + 1):
    summe = summe + zahl * zahl
    operationen = operationen + 2
print("Quadratsumme:", summe)
print("Rechenschritte in der Schleife:", operationen)
# Setzen Sie n auf 1000 und starten Sie erneut.

Eine vektorisierte Operation ist ein einziger Aufruf

Mit NumPy steht die ganze Rechnung in einem Aufruf: Das Feld mit sich selbst multiplizieren und alles aufsummieren. Die Schleife läuft dann nicht mehr in Python, sondern in schnellem, fertig übersetztem Code.

Das Lab-Skript vectors.py rechnet beide Wege für n gleich 1000. Es zählt Rechenschritte, es misst keine Zeit.

Beide Wege für n gleich 1000

Befehl
docker exec jupyter python3 steps/vectors.py

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Gleiches Ergebnis, aber unterschiedlich viele Schritte

Das Skript gibt in englischen Wörtern aus: Beide Ergebnisse sind 333833500 und gleich. Die Schleife braucht 2000 Python-Schritte, NumPy einen.

Die Vektorisierung ändert also nicht das Ergebnis. Sie ändert, wer die Wiederholung ausführt.

Elementweise heißt: Position für Position

Bei einer elementweisen Operation rechnet jede Position nur mit der Position gegenüber. Aus zwei Feldern gleicher Länge wird ein neues Feld dieser Länge.

Weil keine Position die andere braucht, ist die Reihenfolge egal. Das ist es, was eine GPU nutzt.

Zwei Felder, vier Operationen

Positionaba + ba - ba * b
011011-910
122022-1840
233033-2790
344044-36160

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Feld mit 2 multiplizieren

Befehl
docker exec jupyter python3 -c "import numpy as np; print(np.arange(1, 6) * 2)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zwei Felder elementweise addieren

Befehl
docker exec jupyter python3 -c "import numpy as np; print(np.arange(1, 6) + np.arange(10, 60, 10))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Dieselbe Rechnung für jeden Bildpunkt

Code: python
# Die Helligkeit von vier Bildpunkten: dieselbe Rechnung fuer jeden.
helligkeit = [10, 200, 35, 90]
neu = []
for wert in helligkeit:
    neu.append(wert + 10)
print(neu)
# Aendern Sie wert + 10 in wert * 2 und starten Sie erneut.

Ein häufiger Fehler

Warnung

Viele denken, eine Operation auf dem ganzen Feld sei nur eine kürzere Schreibweise. Sie ist mehr: Die Wiederholung läuft in einer Bibliothek, die sie besser planen kann, und auf einer GPU sogar gleichzeitig. Voraussetzung ist, dass jede Position unabhängig bleibt.

Weiterführend

Welche dieser Aufgaben lässt sich elementweise lösen: die Summe aller Werte, die Verdopplung aller Werte oder die Suche des größten Werts? Begründen Sie es mit der Frage, ob jede Position für sich rechnen kann.

Die Antwort kommt in der Lektion über Prozesse wieder: Dort wird aufgeteilt und zusammengeführt.

Über dieses Lab und seinen Quellcode: Parallelverarbeitung-Lab: wie eine GPU denkt, ohne GPU, in JupyterLab

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.