Het Meten van de Prestaties van Functies
Hoewel het meten van string-gebaseerde codefragmenten soms voldoende kan zijn, ontbreekt het deze methode aan flexibiliteit. Het gebruik van timeit met functies biedt een effectievere manier om prestaties te meten, en decorators vereenvoudigen het proces om de prestaties van meerdere functies op een overzichtelijke en modulaire manier te meten.
timeit gebruiken met functies
timeit kan de prestaties van functies direct meten door een callable (d.w.z. een functie) door te geven in plaats van een string. Dit is flexibeler en beter leesbaar dan het gebruik van strings, vooral wanneer je complexe functies wilt benchmarken.
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')
We geven generate_squares door als de te timen functie (callable) aan timeit.timeit(). Net als eerder specificeert de parameter number het aantal keren dat de functie wordt uitgevoerd (15 keer). De gemiddelde uitvoeringstijd wordt vervolgens berekend door de totale tijd te delen door het aantal runs.
Deze methode is netter en efficiënter voor het benchmarken van echte functies, en voorkomt de overhead van het evalueren van code uit een string.
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')
Oeps, we kregen de volgende foutmelding: NameError: name 'np' is not defined. De fout treedt op omdat timeit.timeit() de code in isolatie uitvoert, waardoor numpy niet beschikbaar is tenzij je het expliciet importeert via het setup argument:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Het gebruik van functies is netter, vermindert fouten en vereist geen externe imports via een setup string.
Prestatiemeting verbeteren met decorators
Het toepassen van dezelfde timinglogica op meerdere functies is een gangbare praktijk, en een decorator biedt een overzichtelijke en efficiënte manier om dit te implementeren zonder code te herhalen.
Elke keer dat een functie wordt aangeroepen, wordt deze zoals gebruikelijk uitgevoerd, maar met naadloze benchmarking toegevoegd. Decorators bieden verschillende voordelen: ze vergroten de herbruikbaarheid door dezelfde logica op meerdere functies toe te passen, verbeteren de duidelijkheid door timinglogica te scheiden van de kernfunctionaliteit, en maken aanpassing mogelijk, zoals het aanpassen van het aantal iteraties of het toevoegen van extra statistieken voor prestatieanalyse.
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()
Telkens wanneer je een functie aanroept die is gedecoreerd met @timeit_decorator, wordt de prestatie automatisch gemeten en worden de resultaten weergegeven.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Can you explain how decorators work in Python?
What are some other use cases for decorators besides timing functions?
How can I customize the timeit_decorator for different functions?
Awesome!
Completion rate improved to 7.69
Het Meten van de Prestaties van Functies
Veeg om het menu te tonen
Hoewel het meten van string-gebaseerde codefragmenten soms voldoende kan zijn, ontbreekt het deze methode aan flexibiliteit. Het gebruik van timeit met functies biedt een effectievere manier om prestaties te meten, en decorators vereenvoudigen het proces om de prestaties van meerdere functies op een overzichtelijke en modulaire manier te meten.
timeit gebruiken met functies
timeit kan de prestaties van functies direct meten door een callable (d.w.z. een functie) door te geven in plaats van een string. Dit is flexibeler en beter leesbaar dan het gebruik van strings, vooral wanneer je complexe functies wilt benchmarken.
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')
We geven generate_squares door als de te timen functie (callable) aan timeit.timeit(). Net als eerder specificeert de parameter number het aantal keren dat de functie wordt uitgevoerd (15 keer). De gemiddelde uitvoeringstijd wordt vervolgens berekend door de totale tijd te delen door het aantal runs.
Deze methode is netter en efficiënter voor het benchmarken van echte functies, en voorkomt de overhead van het evalueren van code uit een string.
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')
Oeps, we kregen de volgende foutmelding: NameError: name 'np' is not defined. De fout treedt op omdat timeit.timeit() de code in isolatie uitvoert, waardoor numpy niet beschikbaar is tenzij je het expliciet importeert via het setup argument:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Het gebruik van functies is netter, vermindert fouten en vereist geen externe imports via een setup string.
Prestatiemeting verbeteren met decorators
Het toepassen van dezelfde timinglogica op meerdere functies is een gangbare praktijk, en een decorator biedt een overzichtelijke en efficiënte manier om dit te implementeren zonder code te herhalen.
Elke keer dat een functie wordt aangeroepen, wordt deze zoals gebruikelijk uitgevoerd, maar met naadloze benchmarking toegevoegd. Decorators bieden verschillende voordelen: ze vergroten de herbruikbaarheid door dezelfde logica op meerdere functies toe te passen, verbeteren de duidelijkheid door timinglogica te scheiden van de kernfunctionaliteit, en maken aanpassing mogelijk, zoals het aanpassen van het aantal iteraties of het toevoegen van extra statistieken voor prestatieanalyse.
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()
Telkens wanneer je een functie aanroept die is gedecoreerd met @timeit_decorator, wordt de prestatie automatisch gemeten en worden de resultaten weergegeven.
Bedankt voor je feedback!