Grunnleggende 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.
123456789101112131415import 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')
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:
timeitbenyttertime.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 enntime.time(); -
Automatisk repetisjon:
timeitkjø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:
timeiter 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.
1234567import 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')
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()?
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
Awesome!
Completion rate improved to 7.69
Grunnleggende 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.
123456789101112131415import 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')
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:
timeitbenyttertime.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 enntime.time(); -
Automatisk repetisjon:
timeitkjø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:
timeiter 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.
1234567import 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')
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()?
Takk for tilbakemeldingene dine!