Programavimas

Kaip naudoti „Timeit“, kad būtų galima nustatyti „Python“ kodą

Pagal savo dizainą „Python“ teikia pirmenybę patogumui, įskaitomumui ir naudojimo paprastumui. Bet tai nereiškia, kad turėtumėte tenkintis lėtu „Python“ kodu. Tikriausiai yra kažkas, ką galite padaryti, kad tai paspartintumėte.

Tarp įrankių, skirtų „Python“ kodo našumui nustatyti, paprasčiausias yra laiko modulis. laiko yra naudojamas mažų kodo fragmentų - kelių eilučių, funkcijos - greičiui matuoti vykdant kodą tūkstančius ar net milijonus kartų ir pranešant, kiek laiko tos egzekucijos užtruko.

laiko yra naudingiausia palyginti du ar tris skirtingus būdus, kaip ką nors padaryti ir pamatyti, kuris yra greičiausias. Pvz., Kilpa, vykdoma tūkstančius kartojimų, yra įprasta „Python“ kliūtis. Jei galite rasti būdą paspartinti tos kilpos įgyvendinimą - tarkime, naudodami „Python“ vidinius įtaisus, o ne ranka parašytą kodą, galite gauti išmatuojamą našumo pagerėjimą.

Paprastas „Python timeit“ pavyzdys

Čia yra paprastas pavyzdys laiko darbai:

def f1 (): n diapazone (100): perduoti def f2 (): n = 0, o n <100: n + = 1, jei __name__ == "__main__": importuoti laiką spausdinti (timeit.timeit (f1, skaičius = 100000)) spausdinti (timeit.timeit (f2, skaičius = 100000)) 

Ši programa palygina dviejų būdų, kaip pakartoti ciklą, našumą 100 kartų: naudojant integruotą „Python“diapazonas funkcija (f1) ir didinant kintamąjį (f2). laiko kiekvieną iš šių būdų paleidžia 100 000 kartų, o kiekvieno pabaigoje pateikia bendrą vykdymo laiką. Pagal numatytuosius nustatymuslaiko naudoja vieną milijoną eilučių, tačiau šis pavyzdys parodo, kaip galite nustatyti paleidimų skaičių pagal bet kokį rodomą skaičių.

Rezultatai (iš „Intel i7-3770K“ procesoriaus):

0.1252315

0.45453989999999994

Aiškudiapazonas metodas yra daug greitesnis, maždaug 3,75 karto. Tai nenuostabu; naudojant integruotą „Python“, paprastai gaunamas geresnis našumas nei rankiniu būdu manipuliuojant „Python“ objektais.

Naudokite „Python timeit“, pervesdami eilutę

Kitas naudojimo būdaslaiko yra perduoti eilutę, kuri vertinama kaip „Python“ programa:

importo laikas

spausdinti (timeit.timeit ('n diapazone (100): perduoti'))

Tai taip pat galima padaryti iš komandinės eilutės:

python -m timeit "n diapazone (100): perduoti"

Vis dėlto apskritai lengviau naudoti aukščiau pateiktą metodiką, nes jums nereikia nepatogiai užsimesti kodo į teksto eilutę.

„Python timeit“ patarimai

Kaip naudingalaiko yra, turėkite omenyje šiuos įspėjimus, kaip juos naudoti.

Venkite naudoti „timeit“ profiliuodami visą programą

Niekas tavęs nesakonegali laiko visą programą sulaiko. Pavyzdžiui, paprastas 10 eilučių scenarijus nėra blogas kandidatas šiam profiliui.

Tačiau tam darbui yra geresnių priemonių, pavyzdžiui, „Python“cProfilis modulis, kuriantis kur kas išsamesnę statistiką apie visos programos našumą. laiko geriausiai veikia su vienu komponentu ar kodo fragmentu - vėlgi, funkcija ar keliomis kodo eilutėmis. Viskas, kas daugiau, paprastai duoda rezultatų, kurie yra per daug triukšmingi ir nenuoseklūs, kad galėtumėte pateikti reikšmingos veiklos informacijos.

Be to, jei jūsų sukurta programa užtrunka daug minučių,laiko nebus daug naudos. Pirma, užtruks per daug laiko, kol kodas bus paleistas daugiau nei kelis kartus, todėl pasirinktas laikas bus labai grubus. Dviem kitiems darbui geriau tinka kitos priemonės.

Atlikite kelis laiko intervalus skirtingose ​​mašinose

Kiekvieną kartą programos neveikia tokiu pačiu greičiu. Šiuolaikinė skaičiavimo aplinka kelia daug neapibrėžtumo - konkurencija su kitomis programomis dėl išteklių, talpyklos elgesio, planavimo ir kt.laiko bando tai kompensuoti vykdydamas kodą „ad infinitum“, tačiau vis tiek yra gera idėja sujungti kelis bandymus. Turėtumėte paleisti alaiko profilį daug kartų, išmeskite blogiausius ir geriausius balus, o likusius įvertinkite vidutiniškai.

Galiausiai, tai taip pat padeda atlikti tą patį testą skirtingose ​​sistemose: kaip kažkas, susietas su disku, elgsis SSD, palyginti su įprastu besisukančiu standžiuoju disku? Kaip ir bet kuriuo kitu klausimu apie našumą - neatspėk, išbandyk.