Programiranje

Kako uporabiti timeit za profiliranje kode Python

Python po svoji zasnovi postavlja udobje, berljivost in enostavnost uporabe pred zmogljivost. A to še ne pomeni, da bi se morali zadovoljiti s počasno kodo Python. Verjetno lahko nekaj storite, da ga pospešite.

Med orodji, ki so na voljo za profiliranje zmogljivosti kode Python, je najpreprostejše timeit modul. timeit se uporablja za merjenje hitrosti majhnih delčkov kode - nekaj vrstic, funkcije - tako, da se koda izvede tisoče ali celo milijone krat in sporoči, kako dolgo so te izvedbe trajale.

timeit je najbolj uporaben za primerjavo dveh ali treh različnih načinov, kako nekaj narediti, in ugotovitev, kateri je najhitrejši. Na primer zanka, ki se izvaja na tisoče ponovitev, je pogosto ozko grlo Pythona. Če lahko najdete način za pospešitev izvajanja te zanke - recimo z uporabo vgrajenih Pythonov namesto ročno napisane kode -, lahko dobite merljivo izboljšanje učinkovitosti.

Preprost primer Python timeit

Tu je preprost primer, kako timeit dela:

def f1 (): za n v obsegu (100): podajte def f2 (): n = 0, medtem ko n <100: n + = 1, če __name__ == "__main__": uvoz timeit print (timeit.timeit (f1, number = 100000)) print (timeit.timeit (f2, število = 100000)) 

Ta program primerja zmogljivost dveh načinov ponovitve skozi zanko 100-krat: z uporabo vgrajenega Pythonaobseg funkcija (f1) in s povečevanjem spremenljivke (f2). timeit zažene vsakega od teh pristopov 100.000-krat in na koncu za vsakega poda skupni čas izvajanja. Privzeto,timeit uporablja milijon tekov, vendar ta primer prikazuje, kako lahko nastavite število tekov na katero koli številko, ki se zdi primerna.

Rezultati (iz procesorja Intel i7-3770K):

0.1252315

0.45453989999999994

Jasno jeobseg pristop je veliko hitrejši, in sicer približno 3,75 krat. To ni presenetljivo; uporaba vgrajenega Pythona običajno prinaša boljše rezultate kot ročno upravljanje objektov Python.

Uporabite Python timeit tako, da posredujete niz

Drug način uporabetimeit je predati niz, ki se ocenjuje kot program Python:

uvozni čas

print (timeit.timeit ('za n v obsegu (100): pass'))

To lahko storite tudi iz ukazne vrstice:

python -m timeit "za n v obsegu (100): pass"

Na splošno pa je lažje uporabljati zgoraj prikazano tehniko, saj vam ni treba nerodno podtakniti kode v besedilni niz.

Python timeit nasveti

Tako koristno kottimeit je, upoštevajte ta opozorila o tem, kako ga uporabiti.

Izogibajte se uporabi timeit za profiliranje celotnega programa

Nič ti ne rečene more čas celotnega programa ztimeit. Preprost 10-vrstni skript, na primer, ni slab kandidat za takšno profiliranje.

Toda za to delo obstajajo boljša orodja - na primer PythonovacProfile modul, ki ustvarja veliko podrobnejše statistične podatke o uspešnosti celotnega programa. timeit najbolje deluje z eno samo komponento ali delčkom kode - spet s funkcijo ali nekaj vrsticami kode. Vse, kar je več od tega, običajno povzroči preveč hrupne in nedosledne rezultate, da bi dobili pomembne informacije o uspešnosti.

Če program, ki ga profilirate, traja veliko minut,timeit ne bo veliko koristilo. Za eno bo trajalo predolgo, da se bo koda zagnala več kot nekajkrat, zato bodo izbrani časi zelo surovi. V dveh primerih so druga orodja primernejša za delo.

Izvedite več časovnih tekov na različnih strojih

Programi se ne izvajajo vsakič z enako hitrostjo. Sodobna računalniška okolja vnašajo veliko negotovosti - tekmovanje z drugimi programi za vire, vedenje predpomnilnika, razporejanje itd.timeit poskuša to nadomestiti z izvajanjem kode ad infinitum, vendar je vseeno dobro združiti več preskusov. Moral bi zagnati atimeit večkrat, izbrišite najslabše in najboljše rezultate, ostale pa povprečite.

Na koncu pomaga tudi izvajanje istega testa na različnih sistemih: kako se bo nekaj diskov vezano na SSD v primerjavi z običajnim vrtljivim trdim diskom? Kot pri vseh drugih vprašanjih glede uspešnosti - ne ugibajte, preizkusite.

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