Grundlæggende om Tidsmåling og Benchmarking
Da vi ikke lægger vægt på tidskompleksitetsanalyse i dette kursus, fokuserer vi på empiriske (praktiske) metoder til at måle den faktiske kodeydelse. En af de enkleste måder at måle ydeevnen af et kodeudsnit på er ved at bruge den indbyggede funktion time.time().
Denne funktion returnerer det aktuelle tidspunkt i sekunder siden epoken (systemets referencepunkt for tid). Ved at kalde time.time() før og efter et kodeafsnit kan du beregne forskellen for at se, hvor lang tid det tager at udføre.
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')
Selvom brugen af time.time() er enkel og effektiv til grove estimater, har den flere begrænsninger:
- Lav opløsning: præcisionen af
time.time()kan variere afhængigt af operativsystemet, hvilket kan føre til unøjagtige resultater for små operationer; - Overhead: den inkluderer andre systemprocesser, der kører i baggrunden, hvilket kan forvride målingen;
- Gentager ikke: for mere nøjagtige målinger er det ofte nødvendigt at køre den samme kode flere gange for at få et gennemsnitligt resultat, hvilket
time.time()ikke håndterer automatisk.
Fordele ved at bruge timeit
Modulet timeit er et mere avanceret værktøj, der er designet til at overvinde begrænsningerne ved time.time() og give en pålidelig metode til at måle eksekveringstiden for små kodeudsnit, ofte kaldet mikro-benchmarking.
De vigtigste fordele ved timeit er:
-
Høj præcision:
timeitanvendertime.perf_counter()i baggrunden, et højopløseligt ur, der inkluderer tid brugt under ventetid og I/O, hvilket gør det mere nøjagtigt til korte intervaller endtime.time(); -
Automatisk gentagelse:
timeitkører automatisk koden flere gange og beregner den gennemsnitlige eksekveringstid. Dette hjælper med at reducere effekten af baggrundsprocesser og giver et mere pålideligt mål for kodeydelse; -
Minimal overhead:
timeiter designet til at køre i et rent miljø og deaktiverer midlertidigt garbage collection for at sikre, at målingerne fokuserer på den kode, der benchmarkes, uden forstyrrelser fra hukommelsesstyring.
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 eksempel kører timeit.timeit() koden angivet som en streng (variablen code_snippet) 30 gange (angivet med parameteren number) og returnerer den samlede eksekveringstid for alle 30 gennemløb. Ved at dividere den samlede tid med antallet af iterationer (30) kan man beregne den gennemsnitlige eksekveringstid for et enkelt gennemløb.
Valg af antal iterationer
Valget af antal iterationer afhænger af kompleksiteten af koden, der benchmarkes, samt den præcision, der ønskes i tidsmålingerne. Kørsel af koden med varierende antal iterationer gør det muligt at vurdere stabiliteten i resultaterne; hvis eksekveringstiderne er konsistente, er et optimalt antal iterationer sandsynligvis fundet.
For meget hurtige kodeeksempler (millisekunder eller mindre) bør der tilstræbes 1000+ iterationer for at opnå pålidelige gennemsnit. For kode med moderat eksekveringstid (nogle få millisekunder til sekunder) er 100 til 500 iterationer typisk tilstrækkeligt. For længerevarende kode (flere sekunder eller mere) vil 10 til 50 iterationer som regel give en god balance mellem nøjagtighed og tidsforbrug ved benchmarking.
1. Hvilken funktion giver høj præcision og kører automatisk koden flere gange for at beregne en gennemsnitlig eksekveringstid?
2. Hvorfor kan brugen af time.time() til performancemåling være mindre pålidelig end timeit.timeit()?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you explain how to use the timeit module with functions instead of code strings?
What are some best practices for benchmarking code performance in Python?
Can you provide more examples of using timeit for different types of code?
Awesome!
Completion rate improved to 7.69
Grundlæggende om Tidsmåling og Benchmarking
Stryg for at vise menuen
Da vi ikke lægger vægt på tidskompleksitetsanalyse i dette kursus, fokuserer vi på empiriske (praktiske) metoder til at måle den faktiske kodeydelse. En af de enkleste måder at måle ydeevnen af et kodeudsnit på er ved at bruge den indbyggede funktion time.time().
Denne funktion returnerer det aktuelle tidspunkt i sekunder siden epoken (systemets referencepunkt for tid). Ved at kalde time.time() før og efter et kodeafsnit kan du beregne forskellen for at se, hvor lang tid det tager at udføre.
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')
Selvom brugen af time.time() er enkel og effektiv til grove estimater, har den flere begrænsninger:
- Lav opløsning: præcisionen af
time.time()kan variere afhængigt af operativsystemet, hvilket kan føre til unøjagtige resultater for små operationer; - Overhead: den inkluderer andre systemprocesser, der kører i baggrunden, hvilket kan forvride målingen;
- Gentager ikke: for mere nøjagtige målinger er det ofte nødvendigt at køre den samme kode flere gange for at få et gennemsnitligt resultat, hvilket
time.time()ikke håndterer automatisk.
Fordele ved at bruge timeit
Modulet timeit er et mere avanceret værktøj, der er designet til at overvinde begrænsningerne ved time.time() og give en pålidelig metode til at måle eksekveringstiden for små kodeudsnit, ofte kaldet mikro-benchmarking.
De vigtigste fordele ved timeit er:
-
Høj præcision:
timeitanvendertime.perf_counter()i baggrunden, et højopløseligt ur, der inkluderer tid brugt under ventetid og I/O, hvilket gør det mere nøjagtigt til korte intervaller endtime.time(); -
Automatisk gentagelse:
timeitkører automatisk koden flere gange og beregner den gennemsnitlige eksekveringstid. Dette hjælper med at reducere effekten af baggrundsprocesser og giver et mere pålideligt mål for kodeydelse; -
Minimal overhead:
timeiter designet til at køre i et rent miljø og deaktiverer midlertidigt garbage collection for at sikre, at målingerne fokuserer på den kode, der benchmarkes, uden forstyrrelser fra hukommelsesstyring.
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 eksempel kører timeit.timeit() koden angivet som en streng (variablen code_snippet) 30 gange (angivet med parameteren number) og returnerer den samlede eksekveringstid for alle 30 gennemløb. Ved at dividere den samlede tid med antallet af iterationer (30) kan man beregne den gennemsnitlige eksekveringstid for et enkelt gennemløb.
Valg af antal iterationer
Valget af antal iterationer afhænger af kompleksiteten af koden, der benchmarkes, samt den præcision, der ønskes i tidsmålingerne. Kørsel af koden med varierende antal iterationer gør det muligt at vurdere stabiliteten i resultaterne; hvis eksekveringstiderne er konsistente, er et optimalt antal iterationer sandsynligvis fundet.
For meget hurtige kodeeksempler (millisekunder eller mindre) bør der tilstræbes 1000+ iterationer for at opnå pålidelige gennemsnit. For kode med moderat eksekveringstid (nogle få millisekunder til sekunder) er 100 til 500 iterationer typisk tilstrækkeligt. For længerevarende kode (flere sekunder eller mere) vil 10 til 50 iterationer som regel give en god balance mellem nøjagtighed og tidsforbrug ved benchmarking.
1. Hvilken funktion giver høj præcision og kører automatisk koden flere gange for at beregne en gennemsnitlig eksekveringstid?
2. Hvorfor kan brugen af time.time() til performancemåling være mindre pålidelig end timeit.timeit()?
Tak for dine kommentarer!