Måling af Funktioners Ydeevne
Selvom måling af strengbaserede kodeudsnit nogle gange kan være tilstrækkeligt, mangler denne tilgang fleksibilitet. Brug af timeit med funktioner giver en mere effektiv metode til at måle ydeevne, og dekoratorer forenkler processen med at måle ydeevnen af flere funktioner på en ren og modulær måde.
Brug af timeit med funktioner
timeit kan måle ydeevnen af funktioner direkte ved at modtage et callable (dvs. en funktion) i stedet for en streng. Dette er mere fleksibelt og læsbart end at bruge strenge, især når du ønsker at benchmarke komplekse funktioner.
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')
Vi videregiver generate_squares som funktionen (callable), der skal tidsmåles ved hjælp af timeit.timeit(). Ligesom tidligere angiver parameteren number, hvor mange gange funktionen skal køres (15 gange). Gennemsnitlig eksekveringstid beregnes derefter ved at dividere den samlede tid med antallet af gennemløb.
Denne metode er mere overskuelig og effektiv til benchmarking af reelle funktioner, og den undgår overhead ved evaluering af kode fra en streng.
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')
Ups, vi fik følgende fejl: NameError: name 'np' is not defined. Fejlen opstår, fordi timeit.timeit() kører koden isoleret, så den ikke har adgang til numpy, medmindre du eksplicit importerer det i setup-argumentet:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Brug af funktioner er mere overskueligt, reducerer fejl og kræver ikke håndtering af eksterne imports via en setup-streng.
Forbedring af performancemåling med dekoratorer
Anvendelse af den samme tidsmålingslogik på flere funktioner er almindelig praksis, og en dekorator giver en ren og effektiv metode til at implementere dette uden gentagelse af kode.
Hver gang en funktion kaldes, udføres den som normalt, men med integreret benchmarking tilføjet. Dekoratorer tilbyder flere fordele: de øger genanvendeligheden ved at anvende den samme logik på flere funktioner, forbedrer klarheden ved at adskille tidsmålingslogik fra kernefunktionalitet, og muliggør tilpasning, såsom justering af antal iterationer eller tilføjelse af yderligere målinger til performanceanalyse.
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()
Når du nu kalder en funktion, der er dekoreret med @timeit_decorator, vil dens performance blive automatisk målt, og resultaterne vil blive vist.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 7.69
Måling af Funktioners Ydeevne
Stryg for at vise menuen
Selvom måling af strengbaserede kodeudsnit nogle gange kan være tilstrækkeligt, mangler denne tilgang fleksibilitet. Brug af timeit med funktioner giver en mere effektiv metode til at måle ydeevne, og dekoratorer forenkler processen med at måle ydeevnen af flere funktioner på en ren og modulær måde.
Brug af timeit med funktioner
timeit kan måle ydeevnen af funktioner direkte ved at modtage et callable (dvs. en funktion) i stedet for en streng. Dette er mere fleksibelt og læsbart end at bruge strenge, især når du ønsker at benchmarke komplekse funktioner.
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')
Vi videregiver generate_squares som funktionen (callable), der skal tidsmåles ved hjælp af timeit.timeit(). Ligesom tidligere angiver parameteren number, hvor mange gange funktionen skal køres (15 gange). Gennemsnitlig eksekveringstid beregnes derefter ved at dividere den samlede tid med antallet af gennemløb.
Denne metode er mere overskuelig og effektiv til benchmarking af reelle funktioner, og den undgår overhead ved evaluering af kode fra en streng.
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')
Ups, vi fik følgende fejl: NameError: name 'np' is not defined. Fejlen opstår, fordi timeit.timeit() kører koden isoleret, så den ikke har adgang til numpy, medmindre du eksplicit importerer det i setup-argumentet:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Brug af funktioner er mere overskueligt, reducerer fejl og kræver ikke håndtering af eksterne imports via en setup-streng.
Forbedring af performancemåling med dekoratorer
Anvendelse af den samme tidsmålingslogik på flere funktioner er almindelig praksis, og en dekorator giver en ren og effektiv metode til at implementere dette uden gentagelse af kode.
Hver gang en funktion kaldes, udføres den som normalt, men med integreret benchmarking tilføjet. Dekoratorer tilbyder flere fordele: de øger genanvendeligheden ved at anvende den samme logik på flere funktioner, forbedrer klarheden ved at adskille tidsmålingslogik fra kernefunktionalitet, og muliggør tilpasning, såsom justering af antal iterationer eller tilføjelse af yderligere målinger til performanceanalyse.
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()
Når du nu kalder en funktion, der er dekoreret med @timeit_decorator, vil dens performance blive automatisk målt, og resultaterne vil blive vist.
Tak for dine kommentarer!