Funktion Suorituskyvyn Mittaaminen
Vaikka merkkijonopohjaisten koodinpätkien mittaaminen voi joskus riittää, tämä lähestymistapa ei ole kovin joustava. timeit-moduulin käyttäminen funktioiden kanssa tarjoaa tehokkaamman tavan suorituskyvyn mittaamiseen, ja koristeiden (decorators) avulla useiden funktioiden suorituskyvyn mittaaminen onnistuu siististi ja modulaarisesti.
timeit-moduulin käyttäminen funktioiden kanssa
timeit voi mitata funktioiden suorituskykyä suoraan välittämällä kutsuttavan (eli funktion) merkkijonon sijaan. Tämä on joustavampaa ja luettavampaa kuin merkkijonojen käyttö, erityisesti kun halutaan vertailla monimutkaisempia funktioita.
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')
generate_squares välitetään ajastettavaksi funktioksi (callable) käyttäen timeit.timeit()-funktiota. Kuten aiemmin, number-parametri määrittää, kuinka monta kertaa funktio suoritetaan (15 kertaa). Keskimääräinen suoritusaika lasketaan jakamalla kokonaisaika suorituskertojen määrällä.
Tämä menetelmä on selkeämpi ja tehokkaampi todellisten funktioiden suorituskyvyn mittaamiseen, ja se välttää merkkijonosta suoritettavan koodin aiheuttaman ylimääräisen kuorman.
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')
Virheilmoitus: NameError: name 'np' is not defined. Virhe johtuu siitä, että timeit.timeit() suorittaa koodin eristyksissä, joten sillä ei ole pääsyä numpy-kirjastoon, ellei sitä tuoda erikseen setup-argumentin avulla:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Funktioiden käyttäminen on selkeämpää, vähentää virheitä eikä vaadi ulkoisten tuontien hallintaa setup-merkkijonon kautta.
Suorituskyvyn mittaamisen tehostaminen dekorointien avulla
Saman ajoituslogiikan soveltaminen useisiin funktioihin on yleistä, ja dekorointi tarjoaa selkeän ja tehokkaan tavan toteuttaa tämä ilman koodin toistoa.
Joka kerta kun funktiota kutsutaan, se suoritetaan normaalisti, mutta mittaus tapahtuu saumattomasti. Dekoraattorit tarjoavat useita etuja: ne parantavat uudelleenkäytettävyyttä mahdollistamalla saman logiikan soveltamisen useisiin funktioihin, lisäävät selkeyttä erottamalla ajoituslogiikan ydintoiminnallisuudesta ja mahdollistavat räätälöinnin, kuten iteraatioiden määrän säätämisen tai lisämetriikoiden lisäämisen suorituskyvyn analysointia varten.
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()
Nyt, kun kutsut funktiota, joka on koristeltu @timeit_decorator-dekoroinnilla, sen suorituskyky mitataan automaattisesti ja tulokset näytetään.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
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
Funktion Suorituskyvyn Mittaaminen
Pyyhkäise näyttääksesi valikon
Vaikka merkkijonopohjaisten koodinpätkien mittaaminen voi joskus riittää, tämä lähestymistapa ei ole kovin joustava. timeit-moduulin käyttäminen funktioiden kanssa tarjoaa tehokkaamman tavan suorituskyvyn mittaamiseen, ja koristeiden (decorators) avulla useiden funktioiden suorituskyvyn mittaaminen onnistuu siististi ja modulaarisesti.
timeit-moduulin käyttäminen funktioiden kanssa
timeit voi mitata funktioiden suorituskykyä suoraan välittämällä kutsuttavan (eli funktion) merkkijonon sijaan. Tämä on joustavampaa ja luettavampaa kuin merkkijonojen käyttö, erityisesti kun halutaan vertailla monimutkaisempia funktioita.
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')
generate_squares välitetään ajastettavaksi funktioksi (callable) käyttäen timeit.timeit()-funktiota. Kuten aiemmin, number-parametri määrittää, kuinka monta kertaa funktio suoritetaan (15 kertaa). Keskimääräinen suoritusaika lasketaan jakamalla kokonaisaika suorituskertojen määrällä.
Tämä menetelmä on selkeämpi ja tehokkaampi todellisten funktioiden suorituskyvyn mittaamiseen, ja se välttää merkkijonosta suoritettavan koodin aiheuttaman ylimääräisen kuorman.
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')
Virheilmoitus: NameError: name 'np' is not defined. Virhe johtuu siitä, että timeit.timeit() suorittaa koodin eristyksissä, joten sillä ei ole pääsyä numpy-kirjastoon, ellei sitä tuoda erikseen setup-argumentin avulla:
# Import numpy in timeit's environment
setup = 'import numpy as np'
execution_time = timeit.timeit(code_snippet, setup=setup, number=iterations)
Funktioiden käyttäminen on selkeämpää, vähentää virheitä eikä vaadi ulkoisten tuontien hallintaa setup-merkkijonon kautta.
Suorituskyvyn mittaamisen tehostaminen dekorointien avulla
Saman ajoituslogiikan soveltaminen useisiin funktioihin on yleistä, ja dekorointi tarjoaa selkeän ja tehokkaan tavan toteuttaa tämä ilman koodin toistoa.
Joka kerta kun funktiota kutsutaan, se suoritetaan normaalisti, mutta mittaus tapahtuu saumattomasti. Dekoraattorit tarjoavat useita etuja: ne parantavat uudelleenkäytettävyyttä mahdollistamalla saman logiikan soveltamisen useisiin funktioihin, lisäävät selkeyttä erottamalla ajoituslogiikan ydintoiminnallisuudesta ja mahdollistavat räätälöinnin, kuten iteraatioiden määrän säätämisen tai lisämetriikoiden lisäämisen suorituskyvyn analysointia varten.
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()
Nyt, kun kutsut funktiota, joka on koristeltu @timeit_decorator-dekoroinnilla, sen suorituskyky mitataan automaattisesti ja tulokset näytetään.
Kiitos palautteestasi!