Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Grundlagen der Zeitmessung und des Benchmarkings | Verstehen und Messen der Leistung
Optimierungstechniken in Python

bookGrundlagen der Zeitmessung und des Benchmarkings

Da in diesem Kurs keine Analyse der Zeitkomplexität im Vordergrund steht, konzentrieren wir uns auf empirische (praktische) Methoden zur Messung der tatsächlichen Code-Performance. Eine der einfachsten Möglichkeiten, die Ausführungszeit eines Codeausschnitts zu messen, ist die Verwendung der eingebauten Funktion time.time().

Diese Funktion gibt die aktuelle Zeit in Sekunden seit dem sogenannten Epoch (dem Referenzzeitpunkt des Systems) zurück. Indem Sie time.time() vor und nach einem Codeabschnitt aufrufen, können Sie die Differenz berechnen und so feststellen, wie lange die Ausführung gedauert hat.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Die Verwendung von time.time() ist zwar einfach und für grobe Schätzungen effektiv, weist jedoch mehrere Einschränkungen auf:

  • Geringe Auflösung: Die Genauigkeit von time.time() kann je nach Betriebssystem variieren und zu ungenauen Ergebnissen bei kleinen Operationen führen;
  • Overhead: Es werden auch andere im Hintergrund laufende Systemprozesse einbezogen, was die Messung verfälschen kann;
  • Keine Wiederholungen: Für genauere Messungen ist es oft notwendig, denselben Code mehrfach auszuführen und einen Durchschnittswert zu ermitteln – dies wird von time.time() nicht automatisch unterstützt.

Vorteile der Verwendung von timeit

Das Modul timeit ist ein fortschrittlicheres Werkzeug, das entwickelt wurde, um die Einschränkungen von time.time() zu überwinden und eine zuverlässige Methode zur Messung der Ausführungszeit kleiner Codeausschnitte bereitzustellen, was häufig als Mikro-Benchmarking bezeichnet wird.

Die Hauptvorteile von timeit sind:

  • Hohe Präzision: timeit verwendet intern time.perf_counter(), einen hochauflösenden Timer, der auch die Zeit während des Schlafens und Wartens auf I/O einschließt. Dadurch ist er für kurze Intervalle genauer als time.time();

  • Automatische Wiederholung: timeit führt den Code automatisch mehrfach aus und berechnet die durchschnittliche Ausführungszeit. Dies hilft, die Auswirkungen von Hintergrundprozessen zu minimieren und liefert eine verlässlichere Messung der Code-Performance;

  • Minimaler Overhead: timeit ist darauf ausgelegt, in einer sauberen Umgebung zu laufen und deaktiviert vorübergehend die Speicherbereinigung, um sicherzustellen, dass die Messungen sich auf den zu benchmarkenden Code konzentrieren, ohne durch Speicherverwaltungsoperationen beeinflusst zu werden.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

In diesem Beispiel führt timeit.timeit() den als String angegebenen Code (code_snippet-Variable) 30 Mal aus (festgelegt durch den Parameter number) und gibt die Gesamtausführungszeit für alle 30 Durchläufe zurück. Durch das Teilen der Gesamtzeit durch die Anzahl der Iterationen (30) kann die durchschnittliche Ausführungszeit für einen einzelnen Durchlauf berechnet werden.

Auswahl der Anzahl der Iterationen

Die Auswahl der Anzahl der Iterationen hängt von der Komplexität des zu benchmarkenden Codes und der erforderlichen Präzision der Zeitmessung ab. Durch das Ausführen Ihres Codes mit unterschiedlichen Iterationszahlen können Sie die Stabilität der Ergebnisse beurteilen; wenn die Ausführungszeiten konsistent sind, haben Sie wahrscheinlich eine optimale Iterationszahl gefunden.

Für sehr schnelle Codeausschnitte (Millisekunden oder weniger) sollten Sie 1000+ Iterationen anstreben, um zuverlässige Durchschnittswerte zu erhalten. Für Code mit mittlerer Laufzeit (einige Millisekunden bis Sekunden) sind 100 bis 500 Iterationen in der Regel ausreichend. Für länger laufenden Code (mehrere Sekunden oder mehr) bieten 10 bis 50 Iterationen meist einen guten Kompromiss zwischen Genauigkeit und Zeitaufwand beim Benchmarking.

1. Welche Funktion bietet hohe Präzision und führt den Code automatisch mehrfach aus, um eine durchschnittliche Ausführungszeit zu berechnen?

2. Warum ist die Verwendung von time.time() zur Leistungs­messung möglicherweise weniger zuverlässig als timeit.timeit()?

question mark

Welche Funktion bietet hohe Präzision und führt den Code automatisch mehrfach aus, um eine durchschnittliche Ausführungszeit zu berechnen?

Select the correct answer

question mark

Warum ist die Verwendung von time.time() zur Leistungs­messung möglicherweise weniger zuverlässig als timeit.timeit()?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 2

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 how to use the timeit module with functions instead of code strings?

What are some best practices for benchmarking code performance in Python?

Can you provide more examples of using timeit for different types of code?

Awesome!

Completion rate improved to 7.69

bookGrundlagen der Zeitmessung und des Benchmarkings

Swipe um das Menü anzuzeigen

Da in diesem Kurs keine Analyse der Zeitkomplexität im Vordergrund steht, konzentrieren wir uns auf empirische (praktische) Methoden zur Messung der tatsächlichen Code-Performance. Eine der einfachsten Möglichkeiten, die Ausführungszeit eines Codeausschnitts zu messen, ist die Verwendung der eingebauten Funktion time.time().

Diese Funktion gibt die aktuelle Zeit in Sekunden seit dem sogenannten Epoch (dem Referenzzeitpunkt des Systems) zurück. Indem Sie time.time() vor und nach einem Codeabschnitt aufrufen, können Sie die Differenz berechnen und so feststellen, wie lange die Ausführung gedauert hat.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Die Verwendung von time.time() ist zwar einfach und für grobe Schätzungen effektiv, weist jedoch mehrere Einschränkungen auf:

  • Geringe Auflösung: Die Genauigkeit von time.time() kann je nach Betriebssystem variieren und zu ungenauen Ergebnissen bei kleinen Operationen führen;
  • Overhead: Es werden auch andere im Hintergrund laufende Systemprozesse einbezogen, was die Messung verfälschen kann;
  • Keine Wiederholungen: Für genauere Messungen ist es oft notwendig, denselben Code mehrfach auszuführen und einen Durchschnittswert zu ermitteln – dies wird von time.time() nicht automatisch unterstützt.

Vorteile der Verwendung von timeit

Das Modul timeit ist ein fortschrittlicheres Werkzeug, das entwickelt wurde, um die Einschränkungen von time.time() zu überwinden und eine zuverlässige Methode zur Messung der Ausführungszeit kleiner Codeausschnitte bereitzustellen, was häufig als Mikro-Benchmarking bezeichnet wird.

Die Hauptvorteile von timeit sind:

  • Hohe Präzision: timeit verwendet intern time.perf_counter(), einen hochauflösenden Timer, der auch die Zeit während des Schlafens und Wartens auf I/O einschließt. Dadurch ist er für kurze Intervalle genauer als time.time();

  • Automatische Wiederholung: timeit führt den Code automatisch mehrfach aus und berechnet die durchschnittliche Ausführungszeit. Dies hilft, die Auswirkungen von Hintergrundprozessen zu minimieren und liefert eine verlässlichere Messung der Code-Performance;

  • Minimaler Overhead: timeit ist darauf ausgelegt, in einer sauberen Umgebung zu laufen und deaktiviert vorübergehend die Speicherbereinigung, um sicherzustellen, dass die Messungen sich auf den zu benchmarkenden Code konzentrieren, ohne durch Speicherverwaltungsoperationen beeinflusst zu werden.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

In diesem Beispiel führt timeit.timeit() den als String angegebenen Code (code_snippet-Variable) 30 Mal aus (festgelegt durch den Parameter number) und gibt die Gesamtausführungszeit für alle 30 Durchläufe zurück. Durch das Teilen der Gesamtzeit durch die Anzahl der Iterationen (30) kann die durchschnittliche Ausführungszeit für einen einzelnen Durchlauf berechnet werden.

Auswahl der Anzahl der Iterationen

Die Auswahl der Anzahl der Iterationen hängt von der Komplexität des zu benchmarkenden Codes und der erforderlichen Präzision der Zeitmessung ab. Durch das Ausführen Ihres Codes mit unterschiedlichen Iterationszahlen können Sie die Stabilität der Ergebnisse beurteilen; wenn die Ausführungszeiten konsistent sind, haben Sie wahrscheinlich eine optimale Iterationszahl gefunden.

Für sehr schnelle Codeausschnitte (Millisekunden oder weniger) sollten Sie 1000+ Iterationen anstreben, um zuverlässige Durchschnittswerte zu erhalten. Für Code mit mittlerer Laufzeit (einige Millisekunden bis Sekunden) sind 100 bis 500 Iterationen in der Regel ausreichend. Für länger laufenden Code (mehrere Sekunden oder mehr) bieten 10 bis 50 Iterationen meist einen guten Kompromiss zwischen Genauigkeit und Zeitaufwand beim Benchmarking.

1. Welche Funktion bietet hohe Präzision und führt den Code automatisch mehrfach aus, um eine durchschnittliche Ausführungszeit zu berechnen?

2. Warum ist die Verwendung von time.time() zur Leistungs­messung möglicherweise weniger zuverlässig als timeit.timeit()?

question mark

Welche Funktion bietet hohe Präzision und führt den Code automatisch mehrfach aus, um eine durchschnittliche Ausführungszeit zu berechnen?

Select the correct answer

question mark

Warum ist die Verwendung von time.time() zur Leistungs­messung möglicherweise weniger zuverlässig als timeit.timeit()?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 2
some-alt