Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Funktion Suorituskyvyn Mittaaminen | Suorituskyvyn Ymmärtäminen ja Mittaaminen
Optimointitekniikat Pythonissa

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

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

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.

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

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.

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

Nyt, kun kutsut funktiota, joka on koristeltu @timeit_decorator-dekoroinnilla, sen suorituskyky mitataan automaattisesti ja tulokset näytetään.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

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

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

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

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.

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

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.

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

Nyt, kun kutsut funktiota, joka on koristeltu @timeit_decorator-dekoroinnilla, sen suorituskyky mitataan automaattisesti ja tulokset näytetään.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 3
some-alt