Ajoituksen ja Suorituskyvyn Mittaamisen Perusteet
Koska emme keskity aikavaativuuden analysointiin tässä kurssissa, painotamme empiirisiä (käytännön) menetelmiä koodin suorituskyvyn mittaamiseen. Yksi yksinkertaisimmista tavoista mitata koodinpätkän suorituskykyä on käyttää sisäänrakennettua time.time()-funktiota.
Tämä funktio palauttaa nykyisen ajan sekunneissa epookista (järjestelmän aikaviitepisteestä) lähtien. Kutsumalla time.time() ennen ja jälkeen tietyn koodin, voit laskea erotuksen ja nähdä, kuinka kauan koodin suorittaminen kestää.
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')
Vaikka time.time()-funktion käyttö on yksinkertaista ja tehokasta karkean arvion saamiseksi, sillä on useita rajoituksia:
- Alhainen resoluutio:
time.time()-funktion tarkkuus voi vaihdella käyttöjärjestelmästä riippuen, mikä voi johtaa epätarkkoihin tuloksiin pienissä operaatioissa; - Ylikuormitus: mittaus sisältää myös muut taustalla käynnissä olevat järjestelmäprosessit, mikä voi vääristää tulosta;
- Ei toistoa: tarkempia mittauksia varten sama koodi tulisi usein suorittaa useita kertoja ja laskea keskiarvo, mutta
time.time()ei tee tätä automaattisesti.
timeit-moduulin edut
timeit-moduuli on kehittyneempi työkalu, joka on suunniteltu ratkaisemaan time.time()-funktion rajoitukset ja tarjoamaan luotettavan tavan mitata pienten koodinpätkien suoritusaikaa, mitä kutsutaan usein mikrovertailuksi.
timeit-moduulin tärkeimmät edut ovat:
-
Korkea tarkkuus:
timeitkäyttää taustallatime.perf_counter()-funktiota, joka on korkean resoluution ajastin ja huomioi myös odotus- ja lepotilat, mikä tekee siitä tarkemman lyhyille aikaväleille kuintime.time(); -
Automaattinen toisto:
timeitsuorittaa koodin automaattisesti useita kertoja ja laskee keskimääräisen suoritusaika. Tämä auttaa vähentämään taustaprosessien vaikutusta ja tarjoaa luotettavamman mittauksen koodin suorituskyvystä; -
Vähäinen ylikuorma:
timeiton suunniteltu toimimaan puhtaassa ympäristössä, ja se poistaa tilapäisesti roskienkeruun käytöstä varmistaakseen, että mittaukset kohdistuvat vain testattavaan koodiin ilman muistinhallinnan aiheuttamaa häiriötä.
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')
Tässä esimerkissä timeit.timeit() suorittaa merkkijonona annetun koodin (code_snippet-muuttuja) 30 kertaa (number-parametrilla määriteltynä) ja palauttaa kokonaisajan kaikille 30 suoritukselle. Jakamalla kokonaisaika toistojen määrällä (30) voidaan laskea keskimääräinen suoritusaika yhdelle ajokerralle.
Iteraatioiden määrän valinta
Iteraatioiden määrän valinta riippuu benchmarkattavan koodin monimutkaisuudesta ja halutusta tarkkuudesta ajoitustuloksissa. Suorittamalla koodia eri iterointimäärillä voidaan arvioida tulosten vakautta; jos suoritusaika on yhtenäinen, olet todennäköisesti löytänyt optimaalisen iterointimäärän.
Hyvin nopeille koodinpätkille (millisekunteja tai vähemmän) suositellaan yli 1000 iterointia luotettavien keskiarvojen saamiseksi. Kohtuullisen nopealle koodille (muutamia millisekunteja–sekunteja) 100–500 iterointia on yleensä riittävä. Pidemmän suorituksen koodille (useita sekunteja tai enemmän) 10–50 iterointia tarjoaa yleensä hyvän tasapainon tarkkuuden ja benchmarkkaukseen käytetyn ajan välillä.
1. Mikä funktio tarjoaa korkean tarkkuuden ja suorittaa koodin automaattisesti useita kertoja laskeakseen keskimääräisen suoritusaika?
2. Miksi time.time()-funktion käyttö suorituskyvyn mittaamiseen voi olla vähemmän luotettavaa kuin timeit.timeit()?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 7.69
Ajoituksen ja Suorituskyvyn Mittaamisen Perusteet
Pyyhkäise näyttääksesi valikon
Koska emme keskity aikavaativuuden analysointiin tässä kurssissa, painotamme empiirisiä (käytännön) menetelmiä koodin suorituskyvyn mittaamiseen. Yksi yksinkertaisimmista tavoista mitata koodinpätkän suorituskykyä on käyttää sisäänrakennettua time.time()-funktiota.
Tämä funktio palauttaa nykyisen ajan sekunneissa epookista (järjestelmän aikaviitepisteestä) lähtien. Kutsumalla time.time() ennen ja jälkeen tietyn koodin, voit laskea erotuksen ja nähdä, kuinka kauan koodin suorittaminen kestää.
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')
Vaikka time.time()-funktion käyttö on yksinkertaista ja tehokasta karkean arvion saamiseksi, sillä on useita rajoituksia:
- Alhainen resoluutio:
time.time()-funktion tarkkuus voi vaihdella käyttöjärjestelmästä riippuen, mikä voi johtaa epätarkkoihin tuloksiin pienissä operaatioissa; - Ylikuormitus: mittaus sisältää myös muut taustalla käynnissä olevat järjestelmäprosessit, mikä voi vääristää tulosta;
- Ei toistoa: tarkempia mittauksia varten sama koodi tulisi usein suorittaa useita kertoja ja laskea keskiarvo, mutta
time.time()ei tee tätä automaattisesti.
timeit-moduulin edut
timeit-moduuli on kehittyneempi työkalu, joka on suunniteltu ratkaisemaan time.time()-funktion rajoitukset ja tarjoamaan luotettavan tavan mitata pienten koodinpätkien suoritusaikaa, mitä kutsutaan usein mikrovertailuksi.
timeit-moduulin tärkeimmät edut ovat:
-
Korkea tarkkuus:
timeitkäyttää taustallatime.perf_counter()-funktiota, joka on korkean resoluution ajastin ja huomioi myös odotus- ja lepotilat, mikä tekee siitä tarkemman lyhyille aikaväleille kuintime.time(); -
Automaattinen toisto:
timeitsuorittaa koodin automaattisesti useita kertoja ja laskee keskimääräisen suoritusaika. Tämä auttaa vähentämään taustaprosessien vaikutusta ja tarjoaa luotettavamman mittauksen koodin suorituskyvystä; -
Vähäinen ylikuorma:
timeiton suunniteltu toimimaan puhtaassa ympäristössä, ja se poistaa tilapäisesti roskienkeruun käytöstä varmistaakseen, että mittaukset kohdistuvat vain testattavaan koodiin ilman muistinhallinnan aiheuttamaa häiriötä.
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')
Tässä esimerkissä timeit.timeit() suorittaa merkkijonona annetun koodin (code_snippet-muuttuja) 30 kertaa (number-parametrilla määriteltynä) ja palauttaa kokonaisajan kaikille 30 suoritukselle. Jakamalla kokonaisaika toistojen määrällä (30) voidaan laskea keskimääräinen suoritusaika yhdelle ajokerralle.
Iteraatioiden määrän valinta
Iteraatioiden määrän valinta riippuu benchmarkattavan koodin monimutkaisuudesta ja halutusta tarkkuudesta ajoitustuloksissa. Suorittamalla koodia eri iterointimäärillä voidaan arvioida tulosten vakautta; jos suoritusaika on yhtenäinen, olet todennäköisesti löytänyt optimaalisen iterointimäärän.
Hyvin nopeille koodinpätkille (millisekunteja tai vähemmän) suositellaan yli 1000 iterointia luotettavien keskiarvojen saamiseksi. Kohtuullisen nopealle koodille (muutamia millisekunteja–sekunteja) 100–500 iterointia on yleensä riittävä. Pidemmän suorituksen koodille (useita sekunteja tai enemmän) 10–50 iterointia tarjoaa yleensä hyvän tasapainon tarkkuuden ja benchmarkkaukseen käytetyn ajan välillä.
1. Mikä funktio tarjoaa korkean tarkkuuden ja suorittaa koodin automaattisesti useita kertoja laskeakseen keskimääräisen suoritusaika?
2. Miksi time.time()-funktion käyttö suorituskyvyn mittaamiseen voi olla vähemmän luotettavaa kuin timeit.timeit()?
Kiitos palautteestasi!