Kako koristiti timeit za profiliranje Python koda

Dizajn, Python stavlja praktičnost, čitljivost i jednostavnost upotrebe ispred performansi. Ali to ne znači da biste se trebali zadovoljiti sporim Python kodom. Vjerojatno možete nešto učiniti kako biste to ubrzali.

Među alatima dostupnim za profiliranje izvedbe Python koda, najjednostavniji je timeitmodul. timeitkoristi se za mjerenje brzine malih isječaka koda - nekoliko redaka, funkcije - izvršavanjem koda tisućama ili čak milijunima puta i izvještavanjem koliko je vremena trebalo da se izvrše ta izvršenja.

timeitje najkorisniji za usporedbu dva ili tri različita načina da se nešto učini i utvrdi koji je najbrži. Na primjer, petlja koja se izvodi na tisuće ponavljanja uobičajeno je usko grlo Pythona. Ako uspijete pronaći način da ubrzate implementaciju te petlje - recimo, upotrebom ugrađenih Pythona umjesto ručno napisanog koda - mogli biste postići mjerljivo poboljšanje performansi.

Jednostavan primjer Python timeit-a

Evo jednostavnog primjera kako to timeitfunkcionira:

def f1 (): za n u rasponu (100): proslijedite def f2 (): n = 0 dok je n <100: n + = 1 ako je __name__ == "__main__": uvoz timeit print (timeit.timeit (f1, number = 100000)) print (timeit.timeit (f2, broj = 100000)) 

Ovaj program uspoređuje izvedbu dva načina za ponavljanje petlje 100 puta: upotrebom ugrađene Pythonove  range funkcije ( f1) i povećavanjem varijable ( f2). timeit izvodi svaki od ovih pristupa 100 000 puta i na kraju daje ukupno vrijeme izvođenja. Prema zadanim postavkama  timeit koristi milijun izvođenja, ali ovaj primjer pokazuje kako možete postaviti broj izvođenja na bilo koju brojku koja se čini prikladnom.

Rezultati (iz procesora Intel i7-3770K):

0,1252315

0,45453989999999994

Jasno je da je  range pristup mnogo brži, za faktor od oko 3,75. To ne čudi; Korištenje ugrađenog Pythona obično daje bolje performanse od ručnog rukovanja Python objektima.

Koristite Python timeit dodavanjem niza

Drugi način korištenja  timeit je prosljeđivanje niza koji se procjenjuje kao Python program:

import timeit

ispis (timeit.timeit ('za n u rasponu (100): prođi'))

To se također može učiniti iz naredbenog retka:

python -m timeit "za n u dometu (100): pass"

U cjelini, međutim, lakše je koristiti gore prikazanu tehniku, jer ne morate neugodno obuti svoj kôd u tekstualni niz.

Python timeit savjeti

Koliko god bili korisni  timeit , imajte na umu ove napomene o tome kako ih koristiti.

Izbjegavajte koristiti timeit za profiliranje cijelog programa

Ništa ne govori da  ne možete  tempirati cijeli program  timeit. Na primjer, jednostavna skripta od 10 redaka nije loš kandidat za ovakvo profiliranje.

Ali postoje bolji alati za taj posao - na primjer, Pythonov  cProfile modul, koji generira daleko detaljniju statistiku o izvedbi cijelog vašeg programa. timeit najbolje radi s jednom komponentom ili isječkom koda - opet s funkcijom ili nekoliko redaka koda. Sve više od toga obično će generirati previše bučne i nedosljedne rezultate da bi vam pružili značajne informacije o izvedbi.

Također, ako program koji profilirate traje puno minuta,  timeit neće biti od velike koristi. Jednom će trebati predugo da se kôd pokrene više od nekoliko puta, tako da će prikupljeni termini biti vrlo grubi. Za dvoje su drugi alati prikladniji za posao.

Izvedite više vremenskih izvođenja na različitim strojevima

Programi se ne pokreću jednakom brzinom svaki put. Moderna računalna okruženja unose puno nesigurnosti - natjecanje s drugim programima za resurse, ponašanje u predmemoriji, raspoređivanje itd. timeit pokušava to nadoknaditi izvršavanjem koda ad infinitum, ali svejedno je dobra ideja objediniti više pokusa. Trebali biste pokrenuti  timeit profil mnogo puta, izbaciti najgore i najbolje ocjene, a ostale prosječiti.

Konačno, pomaže i pokretanje istog testa na različitim sustavima: kako će se nešto povezano s diskom ponašati na SSD-u u odnosu na uobičajeni vrtljivi tvrdi disk? Kao i kod bilo kojeg drugog pitanja o izvedbi - ne pogađajte, testirajte.