Grunderna i Tidtagning och Prestandamätning
Eftersom vi inte lägger tonvikt på tidskomplexitetsanalys i denna kurs, kommer vi att fokusera på empiriska (praktiska) metoder för att mäta faktisk kodprestanda. Ett av de enklaste sätten att mäta prestandan för en kodsnutt är att använda den inbyggda funktionen time.time().
Denna funktion returnerar aktuell tid i sekunder sedan epoken (systemets referenspunkt för tid). Genom att anropa time.time() före och efter en kodsekvens kan du beräkna skillnaden för att se hur lång tid det tar att köra 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')
Även om användning av time.time() är enkelt och effektivt för grova uppskattningar, har det flera begränsningar:
- Låg upplösning: precisionen hos
time.time()kan variera beroende på operativsystem, vilket leder till inexakta resultat för små operationer; - Överliggande processer: den inkluderar andra systemprocesser som körs i bakgrunden, vilket kan förvränga mätningen;
- Ingen upprepning: för mer exakta mätningar är det ofta nödvändigt att köra samma kod flera gånger för att få ett medelvärde, något som
time.time()inte hanterar automatiskt.
Fördelar med att använda timeit
Modulen timeit är ett mer avancerat verktyg som är utformat för att övervinna begränsningarna hos time.time() och ge ett tillförlitligt sätt att mäta exekveringstiden för små kodsnuttar, ofta kallat mikro-benchmarking.
De främsta fördelarna med timeit är:
-
Hög precision:
timeitanvändertime.perf_counter()i bakgrunden, en högupplöst timer som inkluderar tid spenderad under väntan och I/O, vilket gör den mer exakt för korta intervaller äntime.time(); -
Automatisk upprepning:
timeitkör automatiskt koden flera gånger och beräknar den genomsnittliga exekveringstiden. Detta hjälper till att minska effekterna av bakgrundsprocesser och ger en mer tillförlitlig mätning av kodens prestanda; -
Minimal overhead:
timeitär utformat för att köras i en ren miljö och inaktiverar tillfälligt skräpsamling för att säkerställa att mätningarna fokuserar på den kod som testas utan störningar från minneshantering.
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 detta exempel kör timeit.timeit() koden som anges som en sträng (variabeln code_snippet) 30 gånger (anges av parametern number) och returnerar den totala exekveringstiden för alla 30 körningar. Genom att dividera den totala tiden med antalet iterationer (30) kan vi beräkna den genomsnittliga exekveringstiden för en enskild körning.
Val av antal iterationer
Valet av antal iterationer beror på kodens komplexitet som du benchmarkar och den noggrannhet du kräver i tidsmätningen. Att köra din kod med olika antal iterationer gör det möjligt att utvärdera stabiliteten i resultaten; om exekveringstiderna är konsekventa har du troligen hittat ett optimalt antal iterationer.
För mycket snabba kodsnuttar (millisekunder eller mindre), sikta på 1000+ iterationer för att få tillförlitliga medelvärden. För kod med måttlig exekveringstid (några millisekunder till sekunder), bör 100 till 500 iterationer vara tillräckligt. För långsammare kod (flera sekunder eller mer), ger 10 till 50 iterationer oftast en bra balans mellan noggrannhet och tid som spenderas på benchmarking.
1. Vilken funktion ger hög precision och kör automatiskt koden flera gånger för att beräkna en genomsnittlig exekveringstid?
2. Varför kan användning av time.time() för prestandamätning vara mindre tillförlitligt än timeit.timeit()?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 7.69
Grunderna i Tidtagning och Prestandamätning
Svep för att visa menyn
Eftersom vi inte lägger tonvikt på tidskomplexitetsanalys i denna kurs, kommer vi att fokusera på empiriska (praktiska) metoder för att mäta faktisk kodprestanda. Ett av de enklaste sätten att mäta prestandan för en kodsnutt är att använda den inbyggda funktionen time.time().
Denna funktion returnerar aktuell tid i sekunder sedan epoken (systemets referenspunkt för tid). Genom att anropa time.time() före och efter en kodsekvens kan du beräkna skillnaden för att se hur lång tid det tar att köra 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')
Även om användning av time.time() är enkelt och effektivt för grova uppskattningar, har det flera begränsningar:
- Låg upplösning: precisionen hos
time.time()kan variera beroende på operativsystem, vilket leder till inexakta resultat för små operationer; - Överliggande processer: den inkluderar andra systemprocesser som körs i bakgrunden, vilket kan förvränga mätningen;
- Ingen upprepning: för mer exakta mätningar är det ofta nödvändigt att köra samma kod flera gånger för att få ett medelvärde, något som
time.time()inte hanterar automatiskt.
Fördelar med att använda timeit
Modulen timeit är ett mer avancerat verktyg som är utformat för att övervinna begränsningarna hos time.time() och ge ett tillförlitligt sätt att mäta exekveringstiden för små kodsnuttar, ofta kallat mikro-benchmarking.
De främsta fördelarna med timeit är:
-
Hög precision:
timeitanvändertime.perf_counter()i bakgrunden, en högupplöst timer som inkluderar tid spenderad under väntan och I/O, vilket gör den mer exakt för korta intervaller äntime.time(); -
Automatisk upprepning:
timeitkör automatiskt koden flera gånger och beräknar den genomsnittliga exekveringstiden. Detta hjälper till att minska effekterna av bakgrundsprocesser och ger en mer tillförlitlig mätning av kodens prestanda; -
Minimal overhead:
timeitär utformat för att köras i en ren miljö och inaktiverar tillfälligt skräpsamling för att säkerställa att mätningarna fokuserar på den kod som testas utan störningar från minneshantering.
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 detta exempel kör timeit.timeit() koden som anges som en sträng (variabeln code_snippet) 30 gånger (anges av parametern number) och returnerar den totala exekveringstiden för alla 30 körningar. Genom att dividera den totala tiden med antalet iterationer (30) kan vi beräkna den genomsnittliga exekveringstiden för en enskild körning.
Val av antal iterationer
Valet av antal iterationer beror på kodens komplexitet som du benchmarkar och den noggrannhet du kräver i tidsmätningen. Att köra din kod med olika antal iterationer gör det möjligt att utvärdera stabiliteten i resultaten; om exekveringstiderna är konsekventa har du troligen hittat ett optimalt antal iterationer.
För mycket snabba kodsnuttar (millisekunder eller mindre), sikta på 1000+ iterationer för att få tillförlitliga medelvärden. För kod med måttlig exekveringstid (några millisekunder till sekunder), bör 100 till 500 iterationer vara tillräckligt. För långsammare kod (flera sekunder eller mer), ger 10 till 50 iterationer oftast en bra balans mellan noggrannhet och tid som spenderas på benchmarking.
1. Vilken funktion ger hög precision och kör automatiskt koden flera gånger för att beräkna en genomsnittlig exekveringstid?
2. Varför kan användning av time.time() för prestandamätning vara mindre tillförlitligt än timeit.timeit()?
Tack för dina kommentarer!