Come si profila uno script Python?
Il Progetto Euler e altre gare di codifica spesso hanno un tempo massimo di esecuzione o le persone si vantano di quanto veloce sia la loro particolare soluzione. Con python, a volte gli approcci sono un po' macchinosi - per esempio, aggiungendo codice di temporizzazione a __main__
.
Qual è un buon modo per valutare quanto tempo impiega un programma python ad essere eseguito?
1198
3
Python include un profiler chiamato cProfile. Non solo dà il tempo di esecuzione totale, ma cronometra anche ogni funzione separatamente, e vi dice quante volte ogni funzione è stata chiamata, rendendo facile determinare dove dovreste fare ottimizzazioni.
Potete chiamarlo dall'interno del vostro codice, o dall'interprete, in questo modo:
Ancora più utile, si può invocare il cProfile quando si esegue uno script:
Per renderlo ancora più facile, ho fatto un piccolo file batch chiamato 'profile.bat':
Quindi tutto quello che devo fare è eseguire:
E ottengo questo:
{{{55564}}};
EDIT: Aggiornato il link ad una buona risorsa video da PyCon 2013 intitolata Python Profiling [Anche via YouTube](https://www.youtube.com/watch?v=QJwVYlDzAXs).
Vale la pena sottolineare che l'uso del profilatore funziona solo (per impostazione predefinita) sul thread principale, e non si otterrà alcuna informazione da altri thread se li si utilizza. Questo può essere un po' un intoppo in quanto è completamente non menzionato nella documentazione del profilatore.
Se volete anche profilare i thread, dovrete dare un'occhiata alla funzione
threading.setprofile()
nella documentazione.Potresti anche creare la tua sottoclasse
threading.Thread
per farlo:e usare quella classe
ProfiledThread
invece di quella standard. Potrebbe darti più flessibilità, ma non sono sicuro che ne valga la pena, specialmente se stai usando codice di terze parti che non userebbe la tua classe.In Virtaal source c'è una classe e un decoratore molto utili che possono rendere il profiling (anche per specifici metodi/funzioni) molto facile. L'output può poi essere visualizzato molto comodamente in KCacheGrind.