Ohjelmointi

Kuinka käyttää timeit Python-koodin profilointiin

Suunnittelullaan Python asettaa mukavuuden, luettavuuden ja helppokäyttöisyyden suorituskyvyn edelle. Mutta se ei tarkoita, että sinun pitäisi tyytyä hitaaseen Python-koodiin. Voit luultavasti tehdä jotain sen nopeuttamiseksi.

Python-koodin suorituskyvyn profilointiin käytettävissä olevista työkaluista yksinkertaisin on aika moduuli. aika käytetään mittaamaan pienten koodinpätkien - muutaman rivin, funktion - nopeus suorittamalla koodi tuhansia tai jopa miljoonia kertoja ja ilmoittamalla kuinka kauan näiden suoritusten suorittaminen kesti.

aika on hyödyllisin vertailla kahta tai kolmea tapaa tehdä jotain ja nähdä, mikä on nopein. Esimerkiksi tuhansia iteraatioita käyttävä silmukka on yleinen Python-pullonkaula. Jos löydät tavan nopeuttaa kyseisen silmukan toteuttamista - esimerkiksi käyttämällä Pythonin sisäisiä sisäänrakennuksia käsinkirjoitetun koodin sijaan - saatat saada mitattavan suorituskyvyn parannuksen.

Yksinkertainen Python timeit -esimerkki

Tässä on yksinkertainen esimerkki miten aika toimii:

def f1 (): n: lle alueella (100): välitä def f2 (): n = 0, kun n <100: n + = 1, jos __nimi__ == "__main__": tuonti aika tulosta (timeit.timeit (f1, numero = 100000)) tulosta (timeit.timeit (f2, numero = 100000)) 

Tämä ohjelma vertaa kahta tapaa suorittaa iterointi silmukan läpi 100 kertaa: käyttämällä Pythonin sisäänrakennettuaalue toiminto (f1) ja lisäämällä muuttujaa (f2). aika suorittaa jokaisen näistä lähestymistavoista 100 000 kertaa, ja tarjoaa loppukäyttäjille kokonaiskäyttöajan kullekin. Oletuksena,aika käyttää miljoona ajoa, mutta tämä esimerkki osoittaa, kuinka voit asettaa ajojen lukumäärän mihin tahansa sopivaan vaikuttavaan lukuun.

Tulokset (Intel i7-3770K -prosessorista):

0.1252315

0.45453989999999994

Selvästialue lähestymistapa on paljon nopeampi, kertoimella noin 3,75. Tämä ei ole yllättävää; Sisäänrakennetun Pythonin käyttäminen tuottaa yleensä paremman suorituskyvyn kuin Python-objektien manuaalinen käsittely.

Käytä Python timeit ohittamalla merkkijono

Toinen tapa käyttääaika on välittää merkkijono, joka arvioidaan Python-ohjelmaksi:

tuonti aika

tulosta (timeit.timeit ('n alueella (100): pass'))

Tämä voidaan tehdä myös komentoriviltä:

python -m timeit "n alueella (100): pass"

Kaiken kaikkiaan on kuitenkin helpompaa käyttää yllä esitettyä tekniikkaa, koska koodia ei tarvitse hankalasti käärittää tekstimerkkijonoksi.

Python timeit -vinkkejä

Yhtä hyödyllinen kuinaika on, pidä mielessä nämä varoitukset siitä, miten sitä käytetään.

Vältä timeitin käyttöä koko ohjelman profiloinnissa

Mikään ei sano sinuaei voi aikaa koko ohjelmaaika. Esimerkiksi yksinkertainen 10-rivinen komentosarja ei ole huono ehdokas profiloitavaksi tällä tavalla.

Mutta tähän työhön on parempia työkaluja - esimerkiksi PythoncProfiili moduuli, joka tuottaa paljon yksityiskohtaisempia tilastoja koko ohjelman suorituskyvystä. aika toimii parhaiten yhden komponentin tai koodinpätkän kanssa - taas funktion tai muutaman koodirivin kanssa. Kaikki muu kuin yleensä tuottaa tuloksia, jotka ovat liian meluisia ja epäjohdonmukaisia ​​antamaan sinulle mielekästä suorituskykytietoa.

Jos profiloitavan ohjelman suorittaminen vie useita minuutteja,aika ei ole paljon hyötyä. Ensinnäkin, koodin suorittaminen kestää liian kauan yli muutaman kerran, joten saadut ajoitukset ovat erittäin karkeita. Kahdelle muut työkalut sopivat paremmin työhön.

Suorita useita aikoja eri koneilla

Ohjelmat eivät toimi samalla nopeudella joka kerta. Nykyaikaiset laskentaympäristöt aiheuttavat paljon epävarmuutta - kilpailu muiden ohjelmien kanssa resursseista, välimuistikäyttäytymisestä, ajoituksesta ja niin edelleen.aika yrittää kompensoida tämän suorittamalla koodin loputtomasti, mutta on silti hyvä idea koota useita kokeita. Sinun tulisi suorittaa aaika profiilin monta kertaa, heittää pois pahimmat ja parhaat pisteet ja keskiarvo loput.

Lopuksi, se auttaa myös suorittamaan saman testin eri järjestelmissä: miten jotain levyyn sidottua käyttäytyy SSD: llä verrattuna perinteiseen pyörivään kiintolevyyn? Kuten muillakin suorituskykyä koskevilla kysymyksillä - älä arvaa, testaa.

$config[zx-auto] not found$config[zx-overlay] not found