Sto sviluppando un modulo intrinsecamente multithread in Python, e mi piacerebbe scoprire dove sta spendendo il suo tempo. cProfile sembra solo profilare il thread principale. C'è un modo per profilare tutti i thread coinvolti nel calcolo?Come posso profilare un programma multithread in Python?
risposta
Vedere yappi (ancora un altro profiler Python).
Non conosco alcuna applicazione di profilazione che supporti tale funzionalità per Python, ma è possibile scrivere una classe di traccia che scrive i file di registro in cui si inseriscono le informazioni di quando un'operazione viene avviata e al termine e quanto tempo ha consumato.
È una soluzione semplice e veloce per il tuo problema.
Invece di eseguire uno cProfile
, è possibile eseguire un'istanza separata cProfile
in ciascun thread, quindi combinare le statistiche. Stats.add()
lo fa automaticamente.
non è eccezionale quando il programma è in fase di avvio e interrompe molti thread nel corso del calcolo: richiede di strumentare l'intero programma, influendo potenzialmente in modo grave sui risultati. – rog
In realtà dovresti solo modificare il metodo Thread.run(). – vartec
ciò che intendo è che il sovraccarico di creazione e salvataggio dell'istanza del profilo per ogni esecuzione del thread potrebbe facilmente alterare i risultati. Non penso sia possibile creare statistiche senza salvare in un file. – rog
Se stai bene con un po 'di lavoro extra, puoi scrivere la tua classe di profilo che implementa profile(self, frame, event, arg)
. Questo viene chiamato ogni volta che viene chiamata una funzione, e puoi facilmente impostare una struttura per raccogliere statistiche da quella.
È quindi possibile utilizzare per registrare tale funzione su ogni thread. Quando viene chiamata la funzione, è possibile utilizzare threading.currentThread()
per vedere su quale è in esecuzione. Maggiori informazioni (e ready-to-run ricetta) qui:
http://code.activestate.com/recipes/465831/
http://docs.python.org/library/threading.html#threading.setprofile
Dato che le funzioni principali tuoi thread diversi differiscono, è possibile utilizzare il molto utile profile_func()
decoratore da here.
- 1. Come posso profilare la memoria del programma multithread in Python?
- 2. Come posso profilare un'applicazione Kivy?
- 3. Programma server multithread in Java
- 4. Come posso riprodurre un'applicazione multithread?
- 5. Come posso profilare un'applicazione alimentata con SQLAlchemy?
- 6. Come posso profilare il codice Python riga per riga?
- 7. C dove definire un mutex in un programma multithread?
- 8. Server Web multithread in python
- 9. E 'possibile profilare un programma Haskell senza librerie prof?
- 10. Come posso profilare l'avvio di un'applicazione Rails?
- 11. Come posso creare un multithread in C per Windows?
- 12. Come posso inviare un segnale da un programma python?
- 13. eclipse java multithread debugging del programma
- 14. Accesso multithread a Python bytearra
- 15. Embedded python nell'applicazione C multithread
- 16. Come posso profilare una richiesta in Ruby on Rails?
- 17. Come profilare un'applicazione Silverlight?
- 18. Come utilizzare callgrind per profilare solo un certo periodo di esecuzione del programma?
- 19. Terminare un programma Python
- 20. Come profilare più sottoprocessi usando Python multiprocessing e memory_profiler?
- 21. Come trasformare un programma python .py in un programma eseguibile in Ubuntu?
- 22. Come si esegue un programma Python?
- 23. Come profilare i metodi in Scala?
- 24. Riavvia un programma Python
- 25. Come profilare il codice QtScript?
- 26. Come potrei usare GIL per un dizionario in un'applicazione multithread?
- 27. Come si può profilare uno script Python parallelizzato?
- 28. Programma Python in un assembly standard?
- 29. Uscita graziosa di un programma in Python?
- 30. Come profilare la garbage collection in Ruby
Si noti che mentre yappi sembra la risposta corretta, è un codice sorgente C e deve essere compilato. Non ci sono binari pre-costruiti nella pagina del progetto. – velis
@velis: è possibile utilizzare pip: 'pip install yappi'. –
Documentazione chiunque? come posso ordinare i risultati per recuperare i primi 10 consumatori di tempo totale? – Dejell