Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Grunderna i Tidtagning och Prestandamätning | Förståelse och Mätning av Prestanda
Optimeringstekniker i Python

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

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

Ä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: timeit använder time.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 än time.time();

  • Automatisk upprepning: timeit kö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.

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 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()?

question mark

Vilken funktion ger hög precision och kör automatiskt koden flera gånger för att beräkna en genomsnittlig exekveringstid?

Select the correct answer

question mark

Varför kan användning av time.time() för prestandamätning vara mindre tillförlitligt än timeit.timeit()?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

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

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

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

Ä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: timeit använder time.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 än time.time();

  • Automatisk upprepning: timeit kö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.

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 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()?

question mark

Vilken funktion ger hög precision och kör automatiskt koden flera gånger för att beräkna en genomsnittlig exekveringstid?

Select the correct answer

question mark

Varför kan användning av time.time() för prestandamätning vara mindre tillförlitligt än timeit.timeit()?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 2
some-alt