Måling av Funksjonsytelse
Selv om måling av strengbaserte kodebiter noen ganger kan være tilstrekkelig, mangler denne tilnærmingen fleksibilitet. Å bruke timeit med funksjoner gir en mer effektiv måte å måle ytelse på, og dekoratører forenkler prosessen med å måle ytelsen til flere funksjoner på en ryddig og modulær måte.
Bruke timeit med funksjoner
timeit kan måle ytelsen til funksjoner direkte ved å sende inn et callable (dvs. en funksjon) i stedet for en streng. Dette er mer fleksibelt og lesbart enn å bruke strenger, spesielt når du ønsker å benchmarke komplekse funksjoner.
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 sender generate_squares som funksjonen (callable) som skal tidsmåles ved bruk av timeit.timeit(). På samme måte som tidligere angir parameteren number hvor mange ganger funksjonen skal kjøres (15 ganger). Gjennomsnittlig kjøretid beregnes deretter ved å dele total tid på antall kjøringer.
Denne metoden er renere og mer effektiv for benchmarking av faktiske funksjoner, og den unngår overheaden ved å evaluere 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 fikk følgende feil: NameError: name 'np' is not defined. Feilen oppstår fordi timeit.timeit() kjører koden i isolasjon, så den har ikke tilgang til numpy med mindre du eksplisitt 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)
Å bruke funksjoner er renere, reduserer feil og krever ikke håndtering av eksterne importer gjennom en setup-streng.
Forbedring av ytelsesmåling med dekoratører
Å bruke samme tidsmålingslogikk på flere funksjoner er en vanlig praksis, og en dekoratør gir en ryddig og effektiv måte å implementere dette på uten å gjenta kode.
Hver gang en funksjon kalles, kjøres den som vanlig, men med sømløs benchmarking lagt til. Dekoratører gir flere fordeler: de øker gjenbrukbarheten ved å bruke samme logikk på flere funksjoner, forbedrer klarheten ved å skille tidsmålingslogikk fra kjernefunksjonalitet, og gir mulighet for tilpasning, som å justere antall iterasjoner eller legge til flere måleparametere for ytelsesanalyse.
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å vil ytelsen til en funksjon som er dekorert med @timeit_decorator automatisk måles, og resultatene vil vises.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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
Måling av Funksjonsytelse
Sveip for å vise menyen
Selv om måling av strengbaserte kodebiter noen ganger kan være tilstrekkelig, mangler denne tilnærmingen fleksibilitet. Å bruke timeit med funksjoner gir en mer effektiv måte å måle ytelse på, og dekoratører forenkler prosessen med å måle ytelsen til flere funksjoner på en ryddig og modulær måte.
Bruke timeit med funksjoner
timeit kan måle ytelsen til funksjoner direkte ved å sende inn et callable (dvs. en funksjon) i stedet for en streng. Dette er mer fleksibelt og lesbart enn å bruke strenger, spesielt når du ønsker å benchmarke komplekse funksjoner.
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 sender generate_squares som funksjonen (callable) som skal tidsmåles ved bruk av timeit.timeit(). På samme måte som tidligere angir parameteren number hvor mange ganger funksjonen skal kjøres (15 ganger). Gjennomsnittlig kjøretid beregnes deretter ved å dele total tid på antall kjøringer.
Denne metoden er renere og mer effektiv for benchmarking av faktiske funksjoner, og den unngår overheaden ved å evaluere 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 fikk følgende feil: NameError: name 'np' is not defined. Feilen oppstår fordi timeit.timeit() kjører koden i isolasjon, så den har ikke tilgang til numpy med mindre du eksplisitt 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)
Å bruke funksjoner er renere, reduserer feil og krever ikke håndtering av eksterne importer gjennom en setup-streng.
Forbedring av ytelsesmåling med dekoratører
Å bruke samme tidsmålingslogikk på flere funksjoner er en vanlig praksis, og en dekoratør gir en ryddig og effektiv måte å implementere dette på uten å gjenta kode.
Hver gang en funksjon kalles, kjøres den som vanlig, men med sømløs benchmarking lagt til. Dekoratører gir flere fordeler: de øker gjenbrukbarheten ved å bruke samme logikk på flere funksjoner, forbedrer klarheten ved å skille tidsmålingslogikk fra kjernefunksjonalitet, og gir mulighet for tilpasning, som å justere antall iterasjoner eller legge til flere måleparametere for ytelsesanalyse.
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å vil ytelsen til en funksjon som er dekorert med @timeit_decorator automatisk måles, og resultatene vil vises.
Takk for tilbakemeldingene dine!