Kursinhalt
Optimierungstechniken in Python
Optimierungstechniken in Python
Maximierung der SortierEffizienz
Eingebaute Sortierung
Wann immer Sie eine Liste sortieren müssen, ist es fast immer am besten, eines der beiden hochoptimierten Sortierwerkzeuge zu verwenden: die Funktion sorted()
oder die Methode sort()
. Beide sind in C implementiert und verwenden Timsort, einen hybriden Algorithmus, der Mergesort und Insertionsort für Effizienz kombiniert.
sorted()
ist ideal für allgemeine Sortierungen, wenn Sie ein beliebiges Iterable sortieren müssen, ohne die ursprünglichen Daten zu verändern. Andererseits ist sort()
am besten für Listen geeignet, wenn eine Änderung vor Ort akzeptabel ist.
Beide Methoden sind effizient, aber list.sort()
kann nur geringfügig schneller für sehr große Listen sein, da es die Erstellung einer neuen Liste vermeidet. Verwenden Sie jedoch sorted()
, wenn Sie die ursprüngliche Liste intakt halten müssen.
Teilweise Sortierung mit heapq
Für Fälle, in denen Sie nur die kleinsten oder größten Elemente eines Datensatzes benötigen, ist das Sortieren der gesamten Daten unnötig. Das Modul heapq
bietet effiziente Methoden wie heapq.nsmallest()
und heapq.nlargest()
, um diese Elemente zu extrahieren, ohne das gesamte Iterable vollständig zu sortieren, was es schneller und speichereffizienter macht.
Vergleichen wir die Leistung der Funktion sorted()
und der Funktion heapq.nsmallest()
für das Abrufen der 10
kleinsten Zahlen aus einer Liste:
import heapq import os decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
Wie Sie sehen können, ist in unserem speziellen Beispiel heapq.nsmallest()
ungefähr 10 Mal schneller.
Wenn jedoch die Anzahl der größten oder kleinsten Elemente (n
), die Sie abrufen möchten, nahe an der Gesamtanzahl der Elemente in der Liste liegt, ist heapq
oft langsamer als die Verwendung der sorted()
-Funktion oder der .sort()
-Methode.
Zum Beispiel, lassen Sie uns jetzt 100000
kleinste Elemente der Liste abrufen:
import heapq import os decorators = os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
Die sorted()
-Funktion übertrifft in diesem Fall eindeutig heapq
.
1. Sie müssen eine gesamte Liste von Zahlen sortieren, während die ursprüngliche Liste intakt bleibt. Welche Sortierfunktion/-methode sollten Sie verwenden?
2. Sie überprüfen einen Datensatz von 500.000 Verkaufsdatensätzen. Um die 20 umsatzstärksten Transaktionen zu identifizieren, welcher Ansatz ist wahrscheinlich schneller und speichereffizienter?
Danke für Ihr Feedback!