Messung der Funktionsleistung
Obwohl das Messen von stringbasierten Code-Snippets manchmal ausreichen kann, mangelt es diesem Ansatz an Flexibilität. Die Verwendung von timeit mit Funktionen bietet eine effektivere Möglichkeit zur Leistungsbewertung, und Dekoratoren vereinfachen das Messen der Performance mehrerer Funktionen auf eine saubere und modulare Weise.
Verwendung von timeit mit Funktionen
timeit kann die Performance von Funktionen direkt messen, indem ein Callable (d. h. eine Funktion) statt eines Strings übergeben wird. Dies ist flexibler und lesbarer als die Verwendung von Strings, insbesondere wenn komplexe Funktionen getestet werden sollen.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Wir übergeben generate_squares als die zu messende Funktion (Callable) an timeit.timeit(). Ähnlich wie zuvor gibt der Parameter number an, wie oft die Funktion ausgeführt werden soll (15 Mal). Die durchschnittliche Ausführungszeit wird anschließend berechnet, indem die Gesamtzeit durch die Anzahl der Durchläufe geteilt wird.
Diese Methode ist übersichtlicher und effizienter für das Benchmarking realer Funktionen und vermeidet den Overhead, Code aus einem String auszuführen.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Hoppla, es ist folgender Fehler aufgetreten: NameError: name 'np' is not defined. Der Fehler tritt auf, weil timeit.timeit() den Code isoliert ausführt und daher keinen Zugriff auf numpy hat, sofern es nicht explizit über das Argument setup importiert wird:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Die Verwendung von Funktionen ist übersichtlicher, reduziert Fehler und erfordert kein separates Verwalten externer Importe über einen setup-String.
Verbesserung der Performancemessung mit Dekoratoren
Das Anwenden derselben Zeitmesslogik auf mehrere Funktionen ist eine gängige Praxis, und ein Dekorator bietet eine saubere und effiziente Möglichkeit, dies umzusetzen, ohne Code zu wiederholen.
Jedes Mal, wenn eine Funktion aufgerufen wird, wird sie wie gewohnt ausgeführt, jedoch mit nahtlosem Benchmarking ergänzt. Dekoratoren bieten mehrere Vorteile: Sie erhöhen die Wiederverwendbarkeit, indem sie dieselbe Logik auf verschiedene Funktionen anwenden, verbessern die Übersichtlichkeit, indem sie die Zeitmesslogik von der Kernfunktionalität trennen, und ermöglichen Anpassungen, wie das Ändern der Anzahl der Iterationen oder das Hinzufügen weiterer Metriken zur Performancemessung.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Immer wenn eine Funktion mit @timeit_decorator dekoriert wird, wird ihre Performance automatisch gemessen und die Ergebnisse werden angezeigt.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 7.69
Messung der Funktionsleistung
Swipe um das Menü anzuzeigen
Obwohl das Messen von stringbasierten Code-Snippets manchmal ausreichen kann, mangelt es diesem Ansatz an Flexibilität. Die Verwendung von timeit mit Funktionen bietet eine effektivere Möglichkeit zur Leistungsbewertung, und Dekoratoren vereinfachen das Messen der Performance mehrerer Funktionen auf eine saubere und modulare Weise.
Verwendung von timeit mit Funktionen
timeit kann die Performance von Funktionen direkt messen, indem ein Callable (d. h. eine Funktion) statt eines Strings übergeben wird. Dies ist flexibler und lesbarer als die Verwendung von Strings, insbesondere wenn komplexe Funktionen getestet werden sollen.
1234567891011121314import timeit import numpy as np # Function to test def generate_squares(): return np.array([x ** 2 for x in range(1000000)]) # Measure time using a callable (function) iterations = 15 execution_time = timeit.timeit(generate_squares, number=iterations) # Calculate average time per run average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Wir übergeben generate_squares als die zu messende Funktion (Callable) an timeit.timeit(). Ähnlich wie zuvor gibt der Parameter number an, wie oft die Funktion ausgeführt werden soll (15 Mal). Die durchschnittliche Ausführungszeit wird anschließend berechnet, indem die Gesamtzeit durch die Anzahl der Durchläufe geteilt wird.
Diese Methode ist übersichtlicher und effizienter für das Benchmarking realer Funktionen und vermeidet den Overhead, Code aus einem String auszuführen.
123456789import timeit import numpy as np code_snippet = 'np.array([x ** 2 for x in range(1000000)])' iterations = 15 execution_time = timeit.timeit(code_snippet, number=iterations) average_time = execution_time / iterations print(f'Average execution time: {average_time:.6f} seconds')
Hoppla, es ist folgender Fehler aufgetreten: NameError: name 'np' is not defined. Der Fehler tritt auf, weil timeit.timeit() den Code isoliert ausführt und daher keinen Zugriff auf numpy hat, sofern es nicht explizit über das Argument setup importiert wird:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Die Verwendung von Funktionen ist übersichtlicher, reduziert Fehler und erfordert kein separates Verwalten externer Importe über einen setup-String.
Verbesserung der Performancemessung mit Dekoratoren
Das Anwenden derselben Zeitmesslogik auf mehrere Funktionen ist eine gängige Praxis, und ein Dekorator bietet eine saubere und effiziente Möglichkeit, dies umzusetzen, ohne Code zu wiederholen.
Jedes Mal, wenn eine Funktion aufgerufen wird, wird sie wie gewohnt ausgeführt, jedoch mit nahtlosem Benchmarking ergänzt. Dekoratoren bieten mehrere Vorteile: Sie erhöhen die Wiederverwendbarkeit, indem sie dieselbe Logik auf verschiedene Funktionen anwenden, verbessern die Übersichtlichkeit, indem sie die Zeitmesslogik von der Kernfunktionalität trennen, und ermöglichen Anpassungen, wie das Ändern der Anzahl der Iterationen oder das Hinzufügen weiterer Metriken zur Performancemessung.
123456789101112131415161718192021import timeit # Decorator to time the execution of a function def timeit_decorator(number=1): def decorator(func): def wrapper(*args, **kwargs): # Measure time with timeit total_time = timeit.timeit(lambda: func(*args, **kwargs), number=number) average_time = total_time / number print(f'{func.__name__} executed in {average_time:.6f} seconds (average over {number} runs)') return func(*args, **kwargs) return wrapper return decorator # Function to measure @timeit_decorator(number=30) def generate_squares(): return [x**2 for x in range(1000000)] # Calling the decorated function squares_array = generate_squares()
Immer wenn eine Funktion mit @timeit_decorator dekoriert wird, wird ihre Performance automatisch gemessen und die Ergebnisse werden angezeigt.
Danke für Ihr Feedback!