Warum Python -Profis Schleifen vermeiden: Ein sanfter Leitfaden zum vektorisierten DenkenWarum Python -Profis Schleifen vermeiden: Ein sanfter Leitfaden zum vektorisierten Denken
Bild von Autor | Leinwand

# Einführung

Wenn Sie neu in Python sind, verwenden Sie normalerweise „für“ Schleifen, wenn Sie eine Datenerfassung verarbeiten müssen. Müssen Sie eine Liste von Zahlen quadratieren? Durch sie durchlaufen. Müssen sie filtern oder zusammenfassen? Schleife noch einmal. Dies ist für uns als Menschen intuitiver, weil unser Gehirn nacheinander denkt und funktioniert (eine Sache nach dem anderen).

Das heißt aber nicht, dass Pc. Sie können etwas nutzen, das genannt wird vektorisiertes Denken. Grundsätzlich geben Sie anstatt jedes Ingredient, um eine Operation durchzuführen, die gesamte Liste an Python wie zu geben. „Hey, hier ist die Liste. Führen Sie alle Operationen gleichzeitig aus.“

In diesem Tutorial geben ich Ihnen eine sanfte Einführung in die Funktionsweise, warum es wichtig ist, und wir werden auch einige Beispiele abdecken, um zu sehen, wie vorteilhaft es sein kann. Additionally fangen wir an.

# Was ist vektorisiertes Denken und warum ist es wichtig?

Wie bereits erwähnt, bedeutet vectorized Considering, dass wir sie gemeinsam ausführen möchten, anstatt nacheinander Operationen zu handeln. Diese Idee ist tatsächlich von Matrix- und Vektoroperationen in Mathematik inspiriert und macht Ihren Code viel schneller und lesbarer. Bibliotheken wie Numpy ermöglichen es Ihnen, vektorisiertes Denken in Python zu implementieren.

Wenn Sie beispielsweise eine Liste von Zahlen mit 2 multiplizieren müssen, dann multiplizieren Sie die gesamte Liste gleichzeitig, anstatt auf jedes Ingredient zu greifen und den Betrieb einzeln durchzuführen. Dies hat erhebliche Vorteile, beispielsweise die Reduzierung eines Großteils von Pythons Overhead. Jedes Mal, wenn Sie eine Python -Schleife durchführen, muss der Dolmetscher viel Arbeit leisten, wie das Überprüfen der Typen, das Verwalten von Objekten und die Handhabung der Schleifenmechanik. Mit einem vektorisierten Ansatz reduzieren Sie dies durch Verarbeitung in großen Mengen. Es ist auch viel schneller. Wir werden das später mit einem Beispiel für die Auswirkung der Leistung sehen. Ich habe visualisiert, was ich gerade in Type eines Bildes gesagt habe, damit Sie eine Vorstellung davon bekommen, worauf ich mich beziehe.

Vectorized vs LoopVectorized vs Loop

Nachdem Sie die Vorstellung davon haben, was es ist, lassen Sie uns sehen, wie Sie es implementieren können und wie es nützlich sein kann.

# Ein einfaches Beispiel: Temperaturumwandlung

In verschiedenen Ländern werden unterschiedliche Temperaturkonventionen verwendet. Wenn Sie beispielsweise mit der Fahrenheitskala vertraut sind und die Daten in Celsius angegeben sind, können Sie sie mit beiden Ansätzen konvertieren.

// Der Schleifenansatz

celsius_temps = (0, 10, 20, 30, 40, 50)
fahrenheit_temps = ()

for temp in celsius_temps:
    fahrenheit = (temp * 9/5) + 32
    fahrenheit_temps.append(fahrenheit)

print(fahrenheit_temps)

Ausgabe:

(32.0, 50.0, 68.0, 86.0, 104.0, 122.0)

// Der vektorisierte Ansatz

import numpy as np

celsius_temps = np.array((0, 10, 20, 30, 40, 50))
fahrenheit_temps = (celsius_temps * 9/5) + 32

print(fahrenheit_temps)  # (32. 50. 68. 86. 104. 122.)

Ausgabe:

( 32.  50.  68.  86. 104. 122.)

Anstatt jeweils mit jedem Punkt zu tun zu haben, verwandeln wir die Liste in ein Numpy -Array und wenden die Formel auf alle Elemente gleichzeitig an. Beide verarbeiten die Daten und geben dasselbe Ergebnis. Abgesehen davon, dass der Numpy -Code prägnanter ist, bemerken Sie den Zeitunterschied derzeit nicht. Aber das werden wir in Kürze abdecken.

# Erweitertes Beispiel: Mathematische Operationen auf mehreren Arrays

Nehmen wir ein weiteres Beispiel, in dem wir mehrere Arrays haben, und wir müssen den Gewinn berechnen. So können Sie es mit beiden Ansätzen tun.

// Der Schleifenansatz

revenues = (1000, 1500, 800, 2000, 1200)
prices = (600, 900, 500, 1100, 700)
tax_rates = (0.15, 0.18, 0.12, 0.20, 0.16)

income = ()
for i in vary(len(revenues)):
    gross_profit = revenues(i) - prices(i)
    net_profit = gross_profit * (1 - tax_rates(i))
    income.append(net_profit)

print(income)

Ausgabe:

(340.0, 492.00000000000006, 264.0, 720.0, 420.0)

Hier berechnen wir den Gewinn für jeden Eintrag manuell:

  1. Die Kosten vom Umsatz (Bruttogewinn) subtrahieren
  2. Steuer anwenden
  3. Das Ergebnis einer neuen Liste anhängen

Funktioniert intestine, aber es ist eine Menge manueller Indexierung.

// Der vektorisierte Ansatz

import numpy as np

revenues = np.array((1000, 1500, 800, 2000, 1200))
prices = np.array((600, 900, 500, 1100, 700))
tax_rates = np.array((0.15, 0.18, 0.12, 0.20, 0.16))

gross_profits = revenues - prices
net_profits = gross_profits * (1 - tax_rates)

print(net_profits)

Ausgabe:

(340. 492. 264. 720. 420.)

Die vektorisierte Model ist ebenfalls lesbar und führt gleichzeitig in allen drei Arrays elementzielle Operationen in allen drei Arrays durch. Jetzt möchte ich nicht nur wieder „Es ist schneller“ ohne feste Beweise wiederholt. Und Sie denken vielleicht: „Worüber redet Kanwal überhaupt?“ Aber jetzt, da Sie gesehen haben, wie Sie es implementieren können, schauen wir uns den Leistungsunterschied zwischen beiden an.

# Leistung: Die Zahlen lügen nicht

Der Unterschied, von dem ich spreche, ist nicht nur einen Hype oder eine theoretische Sache. Es ist messbar und bewährt. Schauen wir uns einen praktischen Benchmark an, um zu verstehen, wie viel Verbesserung Sie erwarten können. Wir erstellen einen sehr großen Datensatz von 1.000.000 Instanzen und führen die Operation (x^2 + 3x + 1 ) für jedes Ingredient mit beiden Ansätzen aus und vergleichen die Zeit.

import numpy as np
import time

# Create a big dataset
measurement = 1000000
information = checklist(vary(measurement))
np_data = np.array(information)

# Take a look at loop-based strategy
start_time = time.time()
result_loop = ()
for x in information:
    result_loop.append(x ** 2 + 3 * x + 1)
loop_time = time.time() - start_time

# Take a look at vectorized strategy
start_time = time.time()
result_vector = np_data ** 2 + 3 * np_data + 1
vector_time = time.time() - start_time

print(f"Loop time: {loop_time:.4f} seconds")
print(f"Vector time: {vector_time:.4f} seconds")
print(f"Speedup: {loop_time / vector_time:.1f}x sooner")

Ausgabe:

Loop time: 0.4615 seconds
Vector time: 0.0086 seconds
Speedup: 53.9x sooner

Das ist mehr als 50 Mal schneller !!!

Dies ist keine kleine Optimierung, sondern Ihre Datenverarbeitungsaufgaben (ich spreche von großen Datensätzen) viel praktikabler. Ich benutze Numpy für dieses Tutorial, aber Pandas ist eine weitere Bibliothek, die auf Numpy gebaut wurde. Sie können das auch verwenden.

# Wenn nicht vektorisieren

Nur weil in den meisten Fällen etwas funktioniert, heißt das nicht, dass es der Ansatz ist. Bei der Programmierung hängt Ihr „bester“ Ansatz immer vom vorliegenden Downside ab. Die Vektorisierung ist großartig, wenn Sie denselben Betrieb auf allen Elementen eines Datensatzes ausführen. Wenn Ihre Logik jedoch komplexe Bedingungen, frühe Beendigung oder Operationen umfasst, die von früheren Ergebnissen abhängen, halten Sie sich an den Schleifenbasis.

In ähnlicher Weise könnte bei der Arbeit mit sehr kleinen Datensätzen der Overhead für die Einrichtung vektorisierter Vorgänge die Vorteile überwiegen. Verwenden Sie es additionally einfach dort, wo es Sinn macht, und zwingen Sie es nicht dort, wo es nicht tut.

# Einpacken

Wenn Sie weiter mit Python zusammenarbeiten, fordern Sie sich heraus, Chancen für die Vektorisierung zu erkennen. Wenn Sie nach einem „for` -Schleifen“ greifen, pausieren Sie innehalten und fragen Sie, ob es eine Möglichkeit gibt, den gleichen Operation mit Numph oder Pandas auszudrücken. Meistens gibt es, und das Ergebnis wird Code sein, der nicht nur schneller, sondern auch eleganter und einfacher zu verstehen ist.

Denken Sie daran, das Ziel ist nicht, alle Schleifen aus Ihrem Code zu beseitigen. Es ist, die zu verwenden Richtiges Instrument für den Job.

Kanwal Mehreen Kanwal ist ein Ingenieur für maschinelles Lernen und technischer Schriftsteller mit einer tiefgreifenden Leidenschaft für die Datenwissenschaft und die Schnittstelle von KI mit Medizin. Sie hat das eBook „Produktivität mit Chatgpt maximieren“. Als Google -Era -Gelehrte 2022 für APAC setzt sie sich für Vielfalt und akademische Exzellenz ein. Sie wird auch als Teradata -Vielfalt in Tech Scholar, MITACS Globalink Analysis Scholar und Harvard Wecode Scholar anerkannt. Kanwal ist ein leidenschaftlicher Verfechter der Veränderung, nachdem er Femcodes gegründet hat, um Frauen in STEM -Bereichen zu stärken.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert