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