Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Het Meten van de Prestaties van Functies | Begrijpen en Meten van Prestaties
Optimalisatietechnieken in Python

bookHet 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.

1234567891011121314
import 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')
copy

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.

123456789
import 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')
copy

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.

123456789101112131415161718192021
import 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()
copy

Telkens wanneer je een functie aanroept die is gedecoreerd met @timeit_decorator, wordt de prestatie automatisch gemeten en worden de resultaten weergegeven.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 1. Hoofdstuk 3

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Suggested prompts:

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

bookHet 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.

1234567891011121314
import 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')
copy

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.

123456789
import 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')
copy

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.

123456789101112131415161718192021
import 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()
copy

Telkens wanneer je een functie aanroept die is gedecoreerd met @timeit_decorator, wordt de prestatie automatisch gemeten en worden de resultaten weergegeven.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 1. Hoofdstuk 3
some-alt