2010-10-29 16 views
7

Ho un'applicazione che consiste in più script Python. Alcuni di questi script chiamano codice C. L'applicazione è ora in esecuzione molto più lentamente di quanto non fosse, quindi mi piacerebbe tracciarlo per vedere dove si trova il problema. C'è uno strumento, un pacchetto software o solo un modo per profilare una tale applicazione? Uno strumento che seguirà il codice Python nel codice C e profilerà anche queste chiamate?Come profilo combinato python e c codice

Nota 1: Sono a conoscenza degli strumenti di profilazione standard di Python. Sto specificatamente cercando qui la combinazione di profili Python/C.

Nota 2: i moduli Python chiamano il codice C utilizzando i tipi (vedere http://docs.python.org/library/ctypes.html per i dettagli).

Grazie!

+0

"più lento di quanto non fosse"? Quindi perché devi cambiarlo? – joni

+1

@joni: il codice può cambiare per molti motivi diversi. Inoltre, potrebbe essere rallentato senza modifiche al codice (carichi di lavoro più pesanti, server più occupato, problemi di rete, ecc.). –

+0

@joni: dato che eseguo regolarmente modifiche a questa applicazione, sia in Python che in C, voglio capire ora quale modifica ha causato il rallentamento del codice. – elesser

risposta

3

Stackshots lavoro. Dal momento che hai combinato Python e C puoi gestirli separatamente. Per Python, puoi premere Ctrl-C mentre è lento ad esaminare lo stack. Fallo più volte Ciò esporrà tutto ciò che è possibile correggere nel codice Python. Per il codice C, esegui il tutto sotto un debugger come GDB e premi Ctrl-C per ottenere una traccia di stack in C. Molti di questi espongono tutto ciò che puoi correggere nel codice C. Mi è stato detto che anche OProfile può farlo. (Un altro modo è usare lsstack se disponibile.)

Questo è un metodo poco conosciuto che funziona su questo principio: Supponiamo di avere un ciclo infinito o un ciclo quasi infinito. Come lo troveresti? Fermeresti il ​​programma e vedrai cosa stava facendo, giusto? Supponiamo che il programma abbia impiegato solo il doppio del tempo necessario. Ogni volta che l'hai fermato, la possibilità che tu lo catturi facendo la cosa inutile è del 50%. Quindi tutto ciò che devi fare è fermarlo un certo numero di volte. Non appena lo vedi fare qualcosa che potrebbe essere migliorato, in soli 2 campioni, sai che puoi aggiustarlo per una sana accelerazione. Quindi puoi ripetere per ottenere il prossimo problema. Misurare non è il punto. Prendere le cose che puoi migliorare è il punto.

+0

Idea interessante. Ci proverò questo fine settimana. Grazie. – elesser

1

La combinazione sarebbe piuttosto difficile, ma è possibile utilizzare alcuni profiler standard come valgrind, gprof o anche oprofile (anche se non sono mai riuscito a ottenere un output significativo da esso).

+0

I profiler che non riesci a ottenere nulla di significativo tendono ad essere per uno o più di questi motivi: http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

+0

La domanda a cui si riferisce @ MikeDunlavey è stato rimosso. – kynan

+0

@kynan: Sì. Immagino sia controversa (anche se non dovrebbe essere). Quando ne hai abbastanza, puoi vederlo. –