2013-03-02 20 views
6

Mi piacerebbe avere un frammento del mio codice e vorrei solo il tempo di esecuzione della CPU (ignorando i processi del sistema operativo, ecc.).Cronometrare il tempo della CPU di un programma python?

Ho provato time.clock(), sembra troppo impreciso e dà una risposta diversa ogni volta. (In teoria sicuramente se lo eseguo di nuovo per lo stesso snippet di codice dovrebbe restituire lo stesso valore ??)

Ho giocato con il tempo per circa un'ora. Essenzialmente ciò che lo uccide per me è il processo di "setup", finisco per dover importare circa 20 funzioni che sono poco pratiche visto che sto praticamente riscrivendo il mio codice nella sezione setup per provare ad usarlo.

I Cprofile sono sempre più attraenti, ma restituiscono il tempo della CPU? anche, un punto minore - emette troppe informazioni. C'è un modo per ottenere le informazioni in uscita in un file txt o .dat in modo che io possa effettivamente leggerlo?

Acclamazioni

OS: Ubuntu Programma: python 2.7

+2

Nota che otterrai tempi diversi per ogni corsa, anche se desideri contare i cicli della cpu consumati solo dal tuo processo. Ciò è dovuto alla cache della CPU, che si troverà ogni volta in uno stato diverso (con parti diverse dello spazio degli indirizzi). La cache della CPU è condivisa tra i processi, quindi non è possibile garantire che ad esempio ogni volta che si eseguirà il codice, una determinata variabile verrà conservata nella cache. – liori

+0

[resource.getrusage] (http://docs.python.org/2/library/resource.html) può essere utilizzato per ottenere il tempo di elaborazione in python 2.7 – Annan

risposta

7

Suona come siete alla ricerca di un modo per tempo il livello di processo tempo di esecuzione, la cosa migliore che puoi fare è utilizzare timeit.default_timer() che offre la funzione time.clock() o time.time() più precisa disponibile sulla piattaforma corrente, ma è a livello di sistema, il che significa che altri proceses possono interferire con le tue misurazioni.

Ecco le informazioni dai documenti di timeit.default_timer():

Definire un timer di default, in modo specifico per la piattaforma. Su Windows, time.clock() ha una granularità in microsecondi, ma la granularità di time.time() è 1/60 di secondo. Su Unix, time.clock() ha 1/100th di una seconda granularità e time.time() è molto più preciso. Nella piattaforma , default_timer() misura l'ora dell'orologio a muro, non la CPU tempo. Ciò significa che altri processi in esecuzione sullo stesso computer potrebbero interferire con i tempi .

Si dovrebbe provare a testare c-moduli che potrebbero avere accesso a diversi tempi di temporizzazione.


Il modo migliore per farlo è quello di utilizzare time.process_time() che è disponibile solo in python 3.3 e fino, ecco le informazioni dalla documentazione:

restituire il valore (in secondi frazionari) della somma del sistema e tempo CPU utente del processo corrente. Non include il tempo trascorso durante il sonno. È a livello di processo per definizione. Il punto di riferimento di il valore restituito non è definito, pertanto è valida solo la differenza tra i risultati di chiamate consecutive.

+4

Buona risposta, ma 'process_time' è disponibile solo in Python 3.3 e più tardi, sta usando 2.7. – omz

+0

Damnit hai ragione – Shedokan

+3

'timeit.default_timer()' è 'time.perf_counter()' su Python 3.3+. Ecco ['time.process_time()' e 'time.perf_counter()' per Python 2 su Ubuntu.] (Https://gist.github.com/zed/5073409) – jfs

3

Invece di time.clock(), utilizzare timeit.default_timer(); usa l'opzione più accurata per la tua piattaforma.Ad esempio, per Ubuntu verrà utilizzato lo time.time().

Quando si utilizza timeit, creare una funzione di installazione che è possibile riutilizzare per timeit. Sì, sembra un po 'di lavoro ma garantisce che tu credi ciò che volevi veramente misurare, e non includere il codice di installazione nella sezione misurata in base al tempo.

Problemi correlati