beschleunigen

Python-Skripte um 300% beschleunigen

vg

Ich erinnere mich noch an die Zeit, als ich gerade ein Python-Skript geschrieben habe, in dem ich einen großen Datensatz verarbeiten musste. Es war ein kleines Projekt, aber um so viele Daten zu verarbeiten, musste ich warten… Warte.. Warten Sie lange. Die Aufgabe, die in wenigen Minuten erledigt werden könnte, wird in Stunden gezogen. Dann merkte ich, dass etwas nicht stimmte. Mein Code war nicht optimiert, also habe ich nach vielen Versuchen gelernt, meinen Code zu beschleunigen. Dadurch wird mein Skript um 300 % schneller.

1. Profilieren Sie zuerst Ihren Code

Zuerst müssen wir herausfinden, welcher Teil des Codes die Verlangsamung verursacht. Aber wir müssen diesen Teil nicht erraten.

In Python können wir cProfile verwenden, was hilft zu verstehen, welcher Teil des Programms die meiste Zeit in Anspruch nimmt.

Lassen Sie uns verstehen, wie ich es verwende:

import cProfile
def my_script():
# Ihr Code hier
übergeben
cProfile.run('my_script()')

Er gibt uns eine detaillierte Aufschlüsselung, wie viel Zeit jede Funktion in Anspruch nimmt.

Als ich cProfile in meinem Skript verwendete, stellte ich fest, dass 80 % der Laufzeit meines Skripts in nur zwei Funktionen verbracht wurden. Also beschloss ich, diese Funktionen zu optimieren.

2. Verwenden Sie integrierte Funktionen

Wie Sie und ich bereits wissen, werden in Python integrierte Funktionen in C geschrieben, sie werden viel schneller ausgeführt als die Funktionen, die wir in Python schreiben werden.

In meinem Code habe ich eine for Schleife verwendet, um die Zahlen in einer Liste hinzuzufügen:

Gesamt = 0 
für Summe in my_list:
Gesamt += Summe

Also habe ich es durch die integrierte Funktion sum von Python ersetzt:

Gesamt = sum(my_list)

Dadurch wird die Laufzeit dieses Teils meines Codes einfach um 50 % beschleunigt.

3. Verwenden Sie Listenverständnisse anstelle von Schleifen

Ich weiß, dass Loops einfach zu schreiben sind, aber nicht immer die schnellsten. Deshalb habe ich einen Code, der eine neue Liste aus einer vorhandenen Liste mit einer for-Schleife erstellt:

new_list = [] 
für Element in old_list:
wenn Element > 10:
new_list.append(Artikel)

Ich habe diesen Code durch ein Listenverständnis ersetzt:

new_list = [Artikel for Artikel in old_list when Artikel 10 >]

Als Ergebnis dieser Änderung wird mein obiger Code 2x schneller.

4. Vermeiden Sie globale Variablen

Ich bin mir nicht sicher, ob Sie davon wissen oder nicht, aber globale Variablen können unser Skript verlangsamen, da Python viele Bereiche überprüfen muss, um den Wert globaler Variablen zu finden.

Ich hatte eine globale Variable Zähler in einer großen Funktion verwendet.

Zähler = 0
def count_items(Artikel):
 global Zähler
 for Artikel in Artikeln:
 Zähler += 1

Aber dann habe ich beschlossen, diese Variable in eine Funktion wie diese zu verschieben:

def count_items(Artikel):
 Zähler = 0
 for Artikel in Artikeln:
 Zähler += 1

Diese Änderung hilft mir sehr, die Geschwindigkeit meines Skripts zu erhöhen.

5. Ersetzen Sie regelmäßige Schleifen durch NumPy

Zuerst habe ich Python-Listen verwendet, um meine numerischen Daten zu verarbeiten, aber dann wurde mir klar, dass ich dafür Numpy verwenden muss.

Zum Beispiel musste ich jeden Punkt auf der Liste mit 2 multiplizieren. Vor Numpy habe ich das so gemacht:

Ergebnis = [x * 2 für x in my_list]

Als ich Numpy dafür verwendete, wurde es so:

Importieren Sie numpy als np
array = np. Matrix(my_list)
Ergebnis = array * 2

Und diese Numpy-Version läuft 10x schneller, wenn wir große Listen haben, da wir wissen, dass Numpy in C erstellt ist. Dies sollten Sie immer verwenden, um die Scripte zu beschleunigen.

6. Verwenden Sie Generatoren für große Datenmengen

In meinem Skript hatte ich eine Funktion, die mit einem großen Datensatz arbeitete. Ich habe Listen verwendet, um die Zwischenergebnisse zu speichern, was den größten Teil des Speichers belegte, was dazu führte, dass alles verlangsamt wurde.

squares = [x**2 for x in range(1_000_000)]

Aber dann habe ich angefangen, Generatoren zu verwenden, die Elemente nacheinander und nicht alle auf einmal verarbeiten.

Quadrate = (x**2 for x in range(1_000_000))

Dies hilft mir, die Speicherauslastung zu reduzieren, was dazu führt, dass mein Skript verbessert wird.

7. Parallelverarbeitung mit multiprocessing

Meine besten Ergebnisse erzielte ich, als ich von mehreren CPU-Kernen erfuhr.

Wie Sie wissen, läuft Python standardmäßig auf einem einzigen Kern. Wenn wir jedoch eine multiprocessing Bibliothek verwenden, können Aufgaben auf andere verfügbare Kerne aufgeteilt werden.

Lasst mich euch erzählen, wie ich das gemacht habe:

from multiprocessing import Pool
def process_data(item):
 # Ihre Verarbeitungslogik gibt hier
 item * 2

return if __name__ == "__main__":
 with Pool() as pool:
 results = pool.Karte(process_data, my_list)

Diese einzige Änderung gibt meinem Skript einen Geschwindigkeitsschub von 100%, da einige Aufgaben jetzt parallel ausgeführt werden können.

8. Vermeiden Sie Wiederholungsarbeiten

Früher hatte ich eine Funktion, die immer wieder das gleiche Ergebnis berechnete.

for Artikel in my_list:
 result = expensive_function(item)
 print(result)

Aber dann beschloss ich, dieses Ergebnis in einer einzigen Variablen zu speichern:

cache = {}
for Element in my_list:
 when Element not in cache:
 cache[item] = expensive_function(item)
 print(cache[item])

Wir können diese Technik Memoisierung nennen und sie hilft mir, viel Zeit zu sparen.

9. Import beschleunigen

Früher habe ich für die Verwendung einer einzigen Funktion aus der Bibliothek die gesamte Bibliothek importiert.

import pandas 
Ergebnis = pandas.read_csv("data.csv")

Aber dann habe ich mich entschieden, meinen Weg zu ändern. Ich habe einfach diese Funktion aus der Bibliothek importiert, die ich benötige:

from pandas import read_csv
Ergebnis = read_csv("data.csv")

Diese Methode hat nicht nur mein Skript beschleunigt, sondern mir auch geholfen, die Startzeit für mein Skript zu reduzieren.

10. Verwenden Sie die neueste Version von Python

Zuvor habe ich die alte Version von Python verwendet. Also habe ich auf die neuere Version aktualisiert und ich habe einen spürbaren Geschwindigkeitsschub in meinem Skript gesehen, auch ohne eine einzige Codezeile zu ändern.

Fazit

Wenn ich die Geschwindigkeit meines Skripts erhöhen kann, können Sie das auch tun. Wir brauchen nur die Geduld und die Bereitschaft zum Experimentieren.

Mehr zum Lesen: Unverzichtbare Tools für jeden Software-Entwickler

com

Newsletter Anmeldung

Bleiben Sie informiert! Wir informieren Sie über alle neuen Beiträge (max. 1 Mail pro Woche – versprochen)