Kursinhalt
Optimierungstechniken in Python
Optimierungstechniken in Python
Listen und NumPy-Arrays
Die Wahl der richtigen Datenstruktur kann sowohl die Geschwindigkeit als auch die Speichernutzung erheblich beeinflussen. Lassen Sie uns zunächst Listen erkunden und sie mit NumPy-Arrays vergleichen, um zu verstehen, wann und wie diese Datenstrukturen effektiv eingesetzt werden können.
Liste
Eine list
ist einer der am häufigsten verwendeten Datentypen. Sie fungiert als dynamisches Array, was bedeutet, dass ihre Größe bei Bedarf wachsen oder schrumpfen kann. Listen sind vielseitig und bieten effizienten Zugriff und Modifikation an beliebigen Indizes. Allerdings können Operationen wie das Einfügen oder Entfernen von Elementen und das Suchen nach einem Element (Überprüfung der Mitgliedschaft) bei großen Listen langsam werden. Die Ausnahme ist das Einfügen oder Entfernen am Ende der Liste, das unabhängig von der Größe der Liste effizient bleibt.
Es wäre eine gute Wahl, Listen in den folgenden Szenarien zu verwenden:
- Sie benötigen geordnete Daten;
- Sie greifen häufig auf Elemente zu oder ändern sie über den Index;
- Sie müssen verschiedene Datentypen speichern (z. B. Ganzzahlen, Zeichenfolgen oder benutzerdefinierte Objekte);
- Sie benötigen keine schnelle Mitgliedschaftsprüfung oder schnelles Einfügen oder Entfernen aus der Mitte der Liste.
my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
NumPy Array
Während Listen vielseitig sind, sind sie nicht die effizienteste Wahl für groß angelegte numerische Operationen. Hier kommen NumPy-Arrays ins Spiel.
NumPy-Arrays sind in C implementiert, was sie für numerische Operationen viel schneller macht als Listen. Ein entscheidender Faktor ist die Vektorisierung, die es ermöglicht, Operationen auf ganzen Arrays gleichzeitig durchzuführen, ohne dass explizite Schleifen erforderlich sind. Dies führt zu erheblichen Leistungssteigerungen, insbesondere bei großen Datensätzen.
Schauen wir uns ein Beispiel an, bei dem jedes Element in einer Liste (unter Verwendung einer for
-Schleife innerhalb einer List Comprehension) und einem NumPy-Array (unter Verwendung der Vektorisierung) quadriert wird:
import numpy as np 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 my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Wie Sie sehen können, ist der Leistungsvorteil von NumPy-Arrays ziemlich offensichtlich.
Beim Umgang mit numerischen Daten bieten NumPy-Arrays einen Speicher-Vorteil gegenüber Listen. Sie speichern tatsächliche Daten in zusammenhängenden Speicherblöcken, was sie effizienter macht, insbesondere für große Datensätze. Da sie homogen (gleicher Datentyp) sind, vermeiden NumPy-Arrays den Overhead von Objektverweisen.
Im Gegensatz dazu sind Listen heterogen und speichern Verweise auf Objekte in zusammenhängendem Speicher, wobei die tatsächlichen Objekte anderswo gespeichert werden. Diese Flexibilität führt zu zusätzlichem Speicher-Overhead beim Arbeiten mit numerischen Daten.
Zusammenfassend vergleicht die folgende Tabelle Listen mit NumPy-Arrays:
1. Sie entwickeln ein Programm zur Verwaltung einer Sammlung von Sensor
-Objekten (benutzerdefinierte Klasse), die jeweils einen timestamp
(String) und eine reading
(Float) enthalten. Der Datensatz wird im Laufe der Zeit wachsen, und häufige Aktualisierungen einzelner Sensorwerte sind erforderlich. Welche Datenstruktur wäre die beste Wahl?
2. Sie arbeiten mit einem großen numerischen Datensatz für ein Machine-Learning-Projekt. Welche Datenstruktur würde die effizienteste Leistung für diese Aufgabe bieten?
3. Sie analysieren Börsendaten, die aus numerischen Werten (Preisen) über die Zeit bestehen. Sie müssen schnelle Berechnungen durchführen, wie zum Beispiel den Durchschnittspreis finden und mathematische Transformationen auf die Daten anwenden. Welche Datenstruktur würden Sie wählen?
Danke für Ihr Feedback!