Programovanie

Ako používať timeit na profilovanie kódu Pythonu

Podľa návrhu Python uprednostňuje pohodlie, čitateľnosť a jednoduché použitie pred výkonom. To však neznamená, že by ste sa mali uspokojiť s pomalým kódom Pythonu. Pravdepodobne je niečo, čo môžete urobiť, aby ste to urýchlili.

Medzi nástrojmi dostupnými na profilovanie výkonu kódu Pythonu je najjednoduchší nástroj timeit modul. timeit sa používa na meranie rýchlosti malých úryvkov kódu - niekoľkých riadkov, funkcie - vykonaním kódu tisíckrát alebo dokonca miliónkrát a oznámením, ako dlho trvá dokončenie týchto poprav.

timeit je najužitočnejšie na porovnanie dvoch alebo troch rôznych spôsobov, ako niečo urobiť, a na zistenie, ktorý je najrýchlejší. Napríklad slučka, ktorá beží pre tisíce iterácií, je bežným úzkym miestom Pythonu. Ak nájdete spôsob, ako urýchliť implementáciu tejto slučky - povedzme pomocou vstavaných kódov Python namiesto ručne písaného kódu -, môžete dosiahnuť merateľné zlepšenie výkonu.

Jednoduchý príklad časového limitu Pythonu

Tu je jednoduchý príklad ako timeit Tvorba:

def f1 (): pre n v rozsahu (100): prejsť def f2 (): n = 0, zatiaľ čo n <100: n + = 1, ak __name__ == "__main__": import timeit print (timeit.timeit (f1, number = 100000)) print (timeit.timeit (f2, number = 100000)) 

Tento program porovnáva výkon dvoch spôsobov, ako iterovať po slučke 100-krát: pomocou zabudovaného Pythonurozsah funkcia (f1) a zvýšením premennej (f2). timeit každý z týchto prístupov beží 100 000-krát a každému z nich na konci poskytuje celkový čas chodu. Predvolene,timeit používa jeden milión behov, ale tento príklad ukazuje, ako môžete nastaviť počet behov na ľubovoľný údaj, ktorý sa javí ako vhodný.

Výsledky (z procesora Intel i7-3770K):

0.1252315

0.45453989999999994

Jednoznačnerozsah prístup je oveľa rýchlejší, a to zhruba o 3,75. To nie je prekvapujúce; použitie zabudovaného Pythonu zvyčajne prináša lepší výkon ako manuálna manipulácia s objektmi Pythonu.

Použite Python timeit zadaním reťazca

Ďalším spôsobom použitiatimeit je odovzdať reťazec, ktorý je vyhodnotený ako program Python:

importovať čas

print (timeit.timeit ('pre n v rozsahu (100): prejsť'))

Môžete to urobiť aj z príkazového riadku:

python -m timeit "pre n v rozsahu (100): prejsť"

Celkovo je však jednoduchšie použiť techniku ​​uvedenú vyššie, pretože svoj kód nemusíte nepríjemne obúvať do textového reťazca.

Tipy pre Python timeit

Rovnako užitočné akotimeit je, majte na pamäti tieto výhrady k tomu, ako ju používať.

Nepoužívajte timeit na profilovanie celého programu

Nič ti nehovorínemôže čas celý program stimeit. Napríklad jednoduchý 10-riadkový skript nie je zlým kandidátom na to, aby bol takto profilovaný.

Existujú však lepšie nástroje pre túto prácu - napríklad Python’scProfil modul, ktorý generuje oveľa podrobnejšie štatistiky o výkonnosti celého vášho programu. timeit funguje najlepšie s jedným komponentom alebo útržkom kódu - opäť s funkciou alebo niekoľkými riadkami kódu. Čokoľvek iné než obvykle vytvorí výsledky, ktoré sú príliš hlučné a nekonzistentné, aby vám poskytli akékoľvek zmysluplné informácie o výkonnosti.

Ak program, ktorý profilováte, trvá tiež veľa minút,timeit nebude veľmi užitočné. Pre jedného bude trvať príliš dlho, kým sa kód spustí viackrát, takže zhromaždené časovania budú veľmi hrubé. Pre dvoch sú pre túto prácu vhodnejšie iné nástroje.

Vykonajte viac časových behov na rôznych strojoch

Programy nepúšťajú vždy rovnakou rýchlosťou. Moderné výpočtové prostredia spôsobujú veľa neistoty - konkurenciu iným programom o zdroje, chovanie v pamäti cache, plánovanie atď.timeit sa to snaží kompenzovať vykonaním kódu ad infinitum, stále je však dobré zhromaždiť viac pokusov. Mali by ste spustiť atimeit profil mnohokrát, vyhodiť najhoršie a najlepšie skóre a zvyšok vypočítať v priemere.

Nakoniec to tiež pomôže spustiť ten istý test na rôznych systémoch: ako sa bude niečo chovať viazané na disk na SSD v porovnaní s konvenčným rotujúcim pevným diskom? Rovnako ako pri akýchkoľvek iných otázkach týkajúcich sa výkonu - nehádajte, testujte.

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