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.12523150.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 časprint (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.