Viac na
Ako môžete profilovať skript Python?
Projekt Euler a iné kódovacie súťaže majú často stanovený maximálny čas behu alebo sa ľudia chvália, ako rýchlo beží ich konkrétne riešenie. V prípade jazyka python sú niekedy prístupy trochu kľukaté - t. j. pridávanie časového kódu do __main__
.
Aký je dobrý spôsob, ako profilovať, ako dlho trvá spustenie programu v jazyku Python?
1198
3
Python obsahuje profilovač s názvom cProfile. Uvádza nielen celkový čas behu, ale aj časy každej funkcie zvlášť a informuje vás, koľkokrát bola každá funkcia volaná, čo uľahčuje určenie, kde by ste mali vykonať optimalizáciu.
Môžete ho zavolať z vášho kódu alebo z interpretu, napríklad takto:
Ešte užitočnejšie je, že cProfile môžete vyvolať pri spustení skriptu:
Aby to bolo ešte jednoduchšie, vytvoril som malý dávkový súbor s názvom 'profile.bat':
Takže všetko, čo musím urobiť, je spustiť:
A dostanem toto:
Jazyk: lang-none -->
EDIT: Aktualizovaný odkaz na dobrý video zdroj z PyCon 2013 s názvom Python Profiling [Tiež cez YouTube](https://www.youtube.com/watch?v=QJwVYlDzAXs).
Stojí za to upozorniť, že použitie profilera funguje (v predvolenom nastavení) len na hlavnom vlákne a v prípade použitia iných vlákien nezískate žiadne informácie. To môže byť trochu chyták, pretože v dokumentácii k profilovaču sa o tom vôbec nehovorí.
Ak chcete profilovať aj vlákna, budete'sa chcieť pozrieť na funkciu
threading.setprofile()
v dokumentácii.Môžete si na to vytvoriť aj vlastnú podtriedu
threading.Thread
:a použiť túto triedu
ProfiledThread
namiesto štandardnej. Mohlo by vám to poskytnúť väčšiu flexibilitu, ale nie'som si istý, či sa to oplatí, najmä ak používate kód tretej strany, ktorý by vašu triedu nepoužíval.Vo Virtaal's source je'veľmi užitočná trieda a dekorátor, ktoré môžu veľmi uľahčiť profilovanie (aj pre konkrétne metódy/funkcie). Výstup sa potom dá veľmi pohodlne prezerať v KCacheGrinde.