Kursinhalt
Optimierungstechniken in Python
Optimierungstechniken in Python
Mengen und Tupel
Bevor wir mit Mengen und Tupeln fortfahren, ist es wichtig zu erwähnen, dass wir Wörterbücher hier nicht besprechen werden.
Menge
Ein Set bietet eine durchschnittliche O(1) Zeitkomplexität für Einfügungen, Löschungen und Suchvorgänge, was bedeutet, dass diese Operationen in konstanter Zeit durchgeführt werden, unabhängig von der Größe des Sets. Dies macht Sets viel schneller als Listen für Mitgliedschaftstests und Operationen wie das Hinzufügen oder Entfernen von Elementen, bei denen Listen im schlimmsten Fall eine O(n) Zeitkomplexität erfordern (die Zeit wächst linear mit der Größe der Liste).
Wann zu verwenden:
- Sie benötigen einzigartige Elemente, um sicherzustellen, dass es keine Duplikate in Ihrer Sammlung gibt;
- Schnelle Mitgliedschaftstests sind erforderlich, was Sets ideal für Aufgaben wie das Überprüfen der Existenz eines Elements macht;
- Sie führen Operationen wie Vereinigungen, Schnittmengen oder Differenzen von Sets durch, die Sets mit optimierten Methoden unterstützen;
- Die Reihenfolge spielt keine Rolle, da Sets von Natur aus ungeordnet sind und es nicht notwendig ist, die Einfügereihenfolge beizubehalten.
# Removing duplicates from a list using a set numbers = [1, 3, 2, 3, 5, 4, 5] unique_numbers = set(numbers) print(f'Unique Numbers: {unique_numbers}') # Fast membership testing names = {'Alice', 'Bob', 'Charlie'} print(f'Is Alice in the set? {"Alice" in names}') print(f'Is Eve in the set? {"Eve" in names}') # Set operations: union, intersection, and difference set_a = {1, 4, 3, 2} set_b = {3, 5, 4, 6} print(f'Union: {set_a.union(set_b)}') print(f'Intersection: {set_a.intersection(set_b)}') print(f'Difference: {set_a.difference(set_b)}') # Removing elements from a set safely with discard names.discard('Alice') # Safe removal, no error if the element doesn't exist print(f'Names after removal: {names}')
Vergleichen wir nun die Leistung eines Sets mit einer Liste beim Mitgliedertest:
import os 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 # Create a large list and set with the same elements large_list = list(range(10000000)) large_set = set(large_list) # Test membership for an element at the end element_to_find = 9999999 @timeit_decorator(number=50) def test_membership(element, collection): return element in collection print('List:') print(test_membership(element_to_find, large_list)) print('Set:') print(test_membership(element_to_find, large_set))
Tupel
Tupel werden typischerweise verwendet, wenn sichergestellt werden muss, dass die Daten nicht geändert werden können oder als Schlüssel in einem dict
oder Element in einem set
(da Tupel hashable sind).
-
Besser als Listen: wenn Sie unveränderliche Daten benötigen, die Sammlung als Schlüssel in einem Wörterbuch oder als Set-Element verwenden möchten oder wenn Sie eine speichereffiziente Speicherung für eine Sammlung fester Größe benötigen;
-
Besser als NumPy-Arrays: wenn Ihre Daten nicht-numerisch sind oder wenn Unveränderlichkeit entscheidend ist. Während NumPy-Arrays für numerische Berechnungen entwickelt wurden und standardmäßig veränderlich sind, bieten Tupel Sicherheit für nicht-numerische Daten oder kleine, strukturierte Sammlungen, die konstant bleiben müssen.
# Each tuple in the list represents an immutable student record students = [ (1834, 'James', 'Johnson'), (2749, 'Alice', 'Smith'), (4923, 'Bob', 'Brown') ] # Attempting to modify a tuple will raise a TypeError students[0][1] = 'Fred'
Da die students
-Liste Studentenaufzeichnungen (ID, Vorname, Nachname) enthält, die schreibgeschützt sein müssen, ist es besser, Tupel für jeden Datensatz anstelle von Listen zu verwenden. Zusätzlich sind, wie oben erwähnt, Tupel im Vergleich zu Listen etwas speichereffizienter.
1. Welches der folgenden Szenarien eignet sich am besten für die Verwendung eines Sets anstelle einer Liste?
2. Sie haben einen Datensatz mit Millionen von Einträgen und müssen häufig überprüfen, ob bestimmte Werte darin existieren. Welche Datenstruktur ist für diesen Zweck am effizientesten?
3. Sie erstellen einen Datensatz für jeden Schüler, der eine eindeutige ID, einen Vornamen und einen Nachnamen enthält. Die Daten sollten nach der Erstellung nicht mehr verändert werden. Welche Datenstruktur wäre am geeignetsten?
Danke für Ihr Feedback!