Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Maximierung der Sortiereffizienz | Enhancing Performance With Built-in Tools
Optimierungstechniken in Python

bookMaximierung der Sortiereffizienz

Eingebaute Sortierung

Wann immer eine Liste sortiert werden muss, ist es – abgesehen von seltenen Spezialfällen – nahezu immer am besten, eines der beiden hochoptimierten Sortierwerkzeuge zu verwenden: die Funktion sorted() oder die Methode sort(). Beide sind in C implementiert und nutzen Timsort, einen hybriden Algorithmus, der Merge Sort und Insertion Sort für maximale Effizienz kombiniert.

sorted() eignet sich für allgemeine Sortieraufgaben, wenn ein beliebiges Iterable ohne Veränderung der Originaldaten sortiert werden soll. Die Methode sort() ist hingegen optimal für Listen, wenn eine Modifikation direkt in der Liste akzeptabel ist.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Beide Methoden sind effizient, jedoch kann list.sort() bei sehr großen Listen minimal schneller sein, da keine neue Liste erstellt wird. Verwenden Sie jedoch sorted(), wenn die ursprüngliche Liste unverändert bleiben soll.

Teilsortierung mit heapq

Wenn nur die kleinsten oder größten Elemente eines Datensatzes benötigt werden, ist das vollständige Sortieren der gesamten Datenmenge nicht erforderlich. Das Modul heapq stellt effiziente Methoden wie heapq.nsmallest() und heapq.nlargest() bereit, um diese Elemente ohne vollständige Sortierung des Iterables zu extrahieren. Dies ist schneller und speichereffizienter.

Vergleich der Performance der Funktion sorted() und der Funktion heapq.nsmallest() beim Abrufen der 10 kleinsten Zahlen aus einer Liste:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-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)
copy

Wie ersichtlich, ist in unserem konkreten Beispiel heapq.nsmallest() etwa 10 Mal schneller.

Ist jedoch die Anzahl der größten oder kleinsten Elemente (n), die abgerufen werden sollen, nahezu so groß wie die Gesamtanzahl der Elemente in der Liste, ist heapq häufig langsamer als die Verwendung der Funktion sorted() oder der Methode .sort().

Beispielsweise rufen wir nun die 100000 kleinsten Elemente der Liste ab:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-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)
copy

Die Funktion sorted() ist in diesem Fall eindeutig leistungsfähiger als heapq.

1. Sie müssen eine vollständige Liste von Zahlen sortieren, wobei die ursprüngliche Liste unverändert bleiben soll. Welche Sortierfunktion/-methode sollten Sie verwenden?

2. Sie überprüfen einen Datensatz mit 500.000 Verkaufsdatensätzen. Um die 20 umsatzstärksten Transaktionen zu identifizieren, welcher Ansatz ist voraussichtlich schneller und speichereffizienter?

question mark

Sie müssen eine vollständige Liste von Zahlen sortieren, wobei die ursprüngliche Liste unverändert bleiben soll. Welche Sortierfunktion/-methode sollten Sie verwenden?

Select the correct answer

question mark

Sie überprüfen einen Datensatz mit 500.000 Verkaufsdatensätzen. Um die 20 umsatzstärksten Transaktionen zu identifizieren, welcher Ansatz ist voraussichtlich schneller und speichereffizienter?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 3

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain why heapq is faster for small n but slower for large n?

When should I use heapq over sorted() in practice?

Are there other efficient ways to partially sort data in Python?

Awesome!

Completion rate improved to 7.69

bookMaximierung der Sortiereffizienz

Swipe um das Menü anzuzeigen

Eingebaute Sortierung

Wann immer eine Liste sortiert werden muss, ist es – abgesehen von seltenen Spezialfällen – nahezu immer am besten, eines der beiden hochoptimierten Sortierwerkzeuge zu verwenden: die Funktion sorted() oder die Methode sort(). Beide sind in C implementiert und nutzen Timsort, einen hybriden Algorithmus, der Merge Sort und Insertion Sort für maximale Effizienz kombiniert.

sorted() eignet sich für allgemeine Sortieraufgaben, wenn ein beliebiges Iterable ohne Veränderung der Originaldaten sortiert werden soll. Die Methode sort() ist hingegen optimal für Listen, wenn eine Modifikation direkt in der Liste akzeptabel ist.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Beide Methoden sind effizient, jedoch kann list.sort() bei sehr großen Listen minimal schneller sein, da keine neue Liste erstellt wird. Verwenden Sie jedoch sorted(), wenn die ursprüngliche Liste unverändert bleiben soll.

Teilsortierung mit heapq

Wenn nur die kleinsten oder größten Elemente eines Datensatzes benötigt werden, ist das vollständige Sortieren der gesamten Datenmenge nicht erforderlich. Das Modul heapq stellt effiziente Methoden wie heapq.nsmallest() und heapq.nlargest() bereit, um diese Elemente ohne vollständige Sortierung des Iterables zu extrahieren. Dies ist schneller und speichereffizienter.

Vergleich der Performance der Funktion sorted() und der Funktion heapq.nsmallest() beim Abrufen der 10 kleinsten Zahlen aus einer Liste:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-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)
copy

Wie ersichtlich, ist in unserem konkreten Beispiel heapq.nsmallest() etwa 10 Mal schneller.

Ist jedoch die Anzahl der größten oder kleinsten Elemente (n), die abgerufen werden sollen, nahezu so groß wie die Gesamtanzahl der Elemente in der Liste, ist heapq häufig langsamer als die Verwendung der Funktion sorted() oder der Methode .sort().

Beispielsweise rufen wir nun die 100000 kleinsten Elemente der Liste ab:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-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)
copy

Die Funktion sorted() ist in diesem Fall eindeutig leistungsfähiger als heapq.

1. Sie müssen eine vollständige Liste von Zahlen sortieren, wobei die ursprüngliche Liste unverändert bleiben soll. Welche Sortierfunktion/-methode sollten Sie verwenden?

2. Sie überprüfen einen Datensatz mit 500.000 Verkaufsdatensätzen. Um die 20 umsatzstärksten Transaktionen zu identifizieren, welcher Ansatz ist voraussichtlich schneller und speichereffizienter?

question mark

Sie müssen eine vollständige Liste von Zahlen sortieren, wobei die ursprüngliche Liste unverändert bleiben soll. Welche Sortierfunktion/-methode sollten Sie verwenden?

Select the correct answer

question mark

Sie überprüfen einen Datensatz mit 500.000 Verkaufsdatensätzen. Um die 20 umsatzstärksten Transaktionen zu identifizieren, welcher Ansatz ist voraussichtlich schneller und speichereffizienter?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 3. Kapitel 3
some-alt