Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Grunnleggende om Tidsmåling og Benchmarking | Forståelse og Måling av Ytelse
Optimaliseringsteknikker i Python

bookGrunnleggende om Tidsmåling og Benchmarking

Siden vi ikke legger vekt på tidskompleksitetsanalyse i dette kurset, vil vi fokusere på empiriske (praktiske) metoder for å måle faktisk ytelse på kode. En av de enkleste måtene å måle ytelsen til en kodebit på, er ved å bruke den innebygde funksjonen time.time().

Denne funksjonen returnerer nåværende tid i sekunder siden epoken (systemets referansepunkt for tid). Ved å kalle time.time() før og etter en kodeblokk, kan du beregne forskjellen for å se hvor lang tid det tar å kjøre koden.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Selv om bruk av time.time() er enkelt og effektivt for grove estimater, har det flere begrensninger:

  • Lav oppløsning: presisjonen til time.time() kan variere avhengig av operativsystemet, noe som kan gi unøyaktige resultater for små operasjoner;
  • Overhead: den inkluderer andre systemprosesser som kjører i bakgrunnen, noe som kan forvrenge målingen;
  • Ingen gjentakelse: for mer nøyaktige målinger er det ofte nødvendig å kjøre samme kode flere ganger for å få et gjennomsnittlig resultat, noe time.time() ikke håndterer automatisk.

Fordeler med å bruke timeit

Modulen timeit er et mer avansert verktøy utviklet for å overvinne begrensningene til time.time() og gi en pålitelig måte å måle kjøretiden til små kodebiter, ofte omtalt som mikro-benchmarking.

De viktigste fordelene med timeit er:

  • Høy presisjon: timeit benytter time.perf_counter() i bakgrunnen, en høytoppløselig timer som inkluderer tid brukt under venting og I/O, noe som gjør den mer nøyaktig for korte intervaller enn time.time();

  • Automatisk repetisjon: timeit kjører automatisk koden flere ganger og beregner gjennomsnittlig kjøretid. Dette bidrar til å redusere effekten av bakgrunnsprosesser og gir et mer pålitelig mål på kodeytelse;

  • Minimal overhead: timeit er laget for å kjøres i et rent miljø, og deaktiverer midlertidig søppelhåndtering for å sikre at målingene fokuserer på koden som benchmarkes uten forstyrrelser fra minnehåndtering.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

I dette eksemplet kjører timeit.timeit() koden som er spesifisert som en streng (variabelen code_snippet) 30 ganger (angitt med parameteren number) og returnerer total kjøretid for alle 30 kjøringer. Ved å dele total tid på antall iterasjoner (30), kan vi beregne gjennomsnittlig kjøretid for én kjøring.

Valg av antall iterasjoner

Valg av antall iterasjoner avhenger av kompleksiteten til koden du måler ytelsen til og presisjonen du ønsker i tidsmålingene. Å kjøre koden med varierende antall iterasjoner gjør det mulig å vurdere stabiliteten i resultatene; hvis kjøretidene er konsistente, har du sannsynligvis funnet et optimalt antall iterasjoner.

For svært raske kodebiter (millisekunder eller mindre), bør du sikte på 1000+ iterasjoner for å få pålitelige gjennomsnitt. For kode med moderat kjøretid (noen millisekunder til sekunder), er 100 til 500 iterasjoner som regel tilstrekkelig. For kode som tar lengre tid (flere sekunder eller mer), vil 10 til 50 iterasjoner vanligvis gi en god balanse mellom nøyaktighet og tiden brukt på målingen.

1. Hvilken funksjon gir høy presisjon og kjører automatisk koden flere ganger for å beregne gjennomsnittlig kjøretid?

2. Hvorfor kan bruk av time.time() for ytelsesmåling være mindre pålitelig enn timeit.timeit()?

question mark

Hvilken funksjon gir høy presisjon og kjører automatisk koden flere ganger for å beregne gjennomsnittlig kjøretid?

Select the correct answer

question mark

Hvorfor kan bruk av time.time() for ytelsesmåling være mindre pålitelig enn timeit.timeit()?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 7.69

bookGrunnleggende om Tidsmåling og Benchmarking

Sveip for å vise menyen

Siden vi ikke legger vekt på tidskompleksitetsanalyse i dette kurset, vil vi fokusere på empiriske (praktiske) metoder for å måle faktisk ytelse på kode. En av de enkleste måtene å måle ytelsen til en kodebit på, er ved å bruke den innebygde funksjonen time.time().

Denne funksjonen returnerer nåværende tid i sekunder siden epoken (systemets referansepunkt for tid). Ved å kalle time.time() før og etter en kodeblokk, kan du beregne forskjellen for å se hvor lang tid det tar å kjøre koden.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Selv om bruk av time.time() er enkelt og effektivt for grove estimater, har det flere begrensninger:

  • Lav oppløsning: presisjonen til time.time() kan variere avhengig av operativsystemet, noe som kan gi unøyaktige resultater for små operasjoner;
  • Overhead: den inkluderer andre systemprosesser som kjører i bakgrunnen, noe som kan forvrenge målingen;
  • Ingen gjentakelse: for mer nøyaktige målinger er det ofte nødvendig å kjøre samme kode flere ganger for å få et gjennomsnittlig resultat, noe time.time() ikke håndterer automatisk.

Fordeler med å bruke timeit

Modulen timeit er et mer avansert verktøy utviklet for å overvinne begrensningene til time.time() og gi en pålitelig måte å måle kjøretiden til små kodebiter, ofte omtalt som mikro-benchmarking.

De viktigste fordelene med timeit er:

  • Høy presisjon: timeit benytter time.perf_counter() i bakgrunnen, en høytoppløselig timer som inkluderer tid brukt under venting og I/O, noe som gjør den mer nøyaktig for korte intervaller enn time.time();

  • Automatisk repetisjon: timeit kjører automatisk koden flere ganger og beregner gjennomsnittlig kjøretid. Dette bidrar til å redusere effekten av bakgrunnsprosesser og gir et mer pålitelig mål på kodeytelse;

  • Minimal overhead: timeit er laget for å kjøres i et rent miljø, og deaktiverer midlertidig søppelhåndtering for å sikre at målingene fokuserer på koden som benchmarkes uten forstyrrelser fra minnehåndtering.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

I dette eksemplet kjører timeit.timeit() koden som er spesifisert som en streng (variabelen code_snippet) 30 ganger (angitt med parameteren number) og returnerer total kjøretid for alle 30 kjøringer. Ved å dele total tid på antall iterasjoner (30), kan vi beregne gjennomsnittlig kjøretid for én kjøring.

Valg av antall iterasjoner

Valg av antall iterasjoner avhenger av kompleksiteten til koden du måler ytelsen til og presisjonen du ønsker i tidsmålingene. Å kjøre koden med varierende antall iterasjoner gjør det mulig å vurdere stabiliteten i resultatene; hvis kjøretidene er konsistente, har du sannsynligvis funnet et optimalt antall iterasjoner.

For svært raske kodebiter (millisekunder eller mindre), bør du sikte på 1000+ iterasjoner for å få pålitelige gjennomsnitt. For kode med moderat kjøretid (noen millisekunder til sekunder), er 100 til 500 iterasjoner som regel tilstrekkelig. For kode som tar lengre tid (flere sekunder eller mer), vil 10 til 50 iterasjoner vanligvis gi en god balanse mellom nøyaktighet og tiden brukt på målingen.

1. Hvilken funksjon gir høy presisjon og kjører automatisk koden flere ganger for å beregne gjennomsnittlig kjøretid?

2. Hvorfor kan bruk av time.time() for ytelsesmåling være mindre pålitelig enn timeit.timeit()?

question mark

Hvilken funksjon gir høy presisjon og kjører automatisk koden flere ganger for å beregne gjennomsnittlig kjøretid?

Select the correct answer

question mark

Hvorfor kan bruk av time.time() for ytelsesmåling være mindre pålitelig enn timeit.timeit()?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 2
some-alt