Programmēšana

Kā izmantot Timeit, lai profilētu Python kodu

Pēc konstrukcijas Python ērtībai, lasāmībai un ērtai lietošanai liek priekšā veiktspēju. Bet tas nenozīmē, ka jums vajadzētu samierināties ar lēnu Python kodu. Iespējams, kaut ko varat darīt, lai to paātrinātu.

Starp rīkiem, kas pieejami Python koda veiktspējas profilēšanai, vienkāršākais ir laiks modulis. laiks tiek izmantots, lai izmērītu nelielu koda fragmentu - dažu rindiņu, funkcijas - ātrumu, izpildot kodu tūkstošiem vai pat miljonu reižu un ziņojot, cik ilgi šīs izpildes bija nepieciešamas.

laiks ir visnoderīgākais, lai salīdzinātu divus vai trīs dažādus veidus, kā kaut ko darīt, un redzētu, kurš ir ātrākais. Piemēram, cilpa, kas darbojas tūkstošiem atkārtojumu, ir parasta Python sašaurināšanās vieta. Ja jūs varat atrast veidu, kā paātrināt šīs cilpas ieviešanu - teiksim, izmantojot Python iebūvētos, nevis ar roku rakstīto kodu, jūs varētu iegūt izmērāmu veiktspējas uzlabojumu.

Vienkāršs Python timeit piemērs

Šeit ir vienkāršs piemērs laiks darbojas:

def f1 (): n diapazonā (100): nodot def f2 (): n = 0, kamēr n <100: n + = 1, ja __name__ == "__main__": importēt laiku drukāt (timeit.timeit (f1, skaitlis = 100000)) izdrukāt (timeit.timeit (f2, skaitlis = 100000)) 

Šī programma salīdzina divu veidu veiktspēju, kā atkārtot ciklu 100 reizes: izmantojot Python iebūvētodiapazons funkcija (f1) un palielinot mainīgo (f2). laiks katru no šīm pieejām palaiž 100 000 reizes, un katrai no tām nodrošina kopējo izpildlaiku. Pēc noklusējuma,laiks izmanto vienu miljonu skrējienu, taču šis piemērs parāda, kā jūs varat iestatīt palaišanas skaitu jebkuram skaitlim, kas šķiet piemērots.

Rezultāti (no Intel i7-3770K procesora):

0.1252315

0.45453989999999994

Skaidrsdiapazons pieeja ir daudz ātrāka, ar koeficientu aptuveni 3,75. Tas nav pārsteidzoši; iebūvēta Python izmantošana parasti nodrošina labāku sniegumu nekā manuāla manipulēšana ar Python objektiem.

Izmantojiet Python timeit, nododot virkni

Vēl viens izmantošanas veidslaiks ir nodot virkni, kas tiek vērtēta kā Python programma:

importa laiks

drukāt (timeit.timeit ('n diapazonā (100): caurlaide'))

To var izdarīt arī no komandrindas:

python -m timeit "n diapazonā (100): izturēt"

Tomēr kopumā ir vieglāk izmantot iepriekš parādīto tehniku, jo jums nav nepieciešams neērti uzvilkt kodu teksta virknē.

Python timeit padomi

Tikpat noderīgi kālaiks ir, paturiet prātā šos brīdinājumus par to, kā to izmantot.

Izvairieties no timeit izmantošanas visas programmas profilēšanai

Nekas tev nesakanevar laiku visu programmu arlaiks. Piemēram, vienkāršs 10 rindiņu skripts nav slikts kandidāts, lai šādā veidā tiktu profilēts.

Bet šim darbam ir labāki rīki, piemēram, Python'scProfils modulis, kas ģenerē daudz detalizētāku statistiku par visas jūsu programmas veiktspēju. laiks vislabāk darbojas ar vienu komponentu vai koda fragmentu - atkal funkciju vai dažām koda rindām. Jebkas cits, kas parasti rada pārāk trokšņainus un pretrunīgus rezultātus, lai sniegtu jums nozīmīgu snieguma informāciju.

Turklāt, ja profilējamā programma tiek pabeigta daudzas minūtes,laiks nebūs daudz noderīga. Pirmkārt, koda izpilde ilgs vairāk nekā dažas reizes, tāpēc izvēlētais laiks būs ļoti rupjš. Diviem darbam labāk piemēroti citi rīki.

Veiciet vairākus laika periodus ar dažādām mašīnām

Katru reizi programmas nedarbojas vienā ātrumā. Mūsdienu skaitļošanas vide rada daudz nenoteiktības - konkurence ar citām programmām par resursiem, kešatmiņas uzvedību, plānošanu utt.laiks mēģina to kompensēt, izpildot kodu ad infinitum, taču joprojām ir laba ideja apkopot vairākus izmēģinājumus. Jums vajadzētu palaist alaiks profilu daudzas reizes, izmetiet sliktākos un labākos rādītājus, bet pārējos vidēji.

Visbeidzot, tas palīdz arī veikt vienu un to pašu testu dažādās sistēmās: kā SSD diskā izturēsies kaut kas ar disku saistīts, salīdzinot ar parasto vērpšanas cieto disku? Tāpat kā ar jebkuru citu jautājumu par veiktspēju - neuzminiet, nepārbaudiet.

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