In UNIX: (a) utilizzare modulo resource (vedi anche risposta di icktoofay), oppure (b) utilizzare il comando time e analizzare i risultati, o (c) utilizzare /proc file system, analizza/proc/[ pid]/stat e analizza i campi utime
e . L'ultimo di questi è specifico per Linux.
Esempio di utilizzo resource
:
import subprocess, resource
usage_start = resource.getrusage(resource.RUSAGE_CHILDREN)
subprocess.call(["yourcommand"])
usage_end = resource.getrusage(resource.RUSAGE_CHILDREN)
cpu_time = usage_end.ru_utime - usage_start.ru_utime
Nota: non è necessario fare forcella/execvp, subprocess.call()
o gli altri metodi sono subprocess bene qui e più facile da usare.
Nota: è possibile eseguire più comandi dello stesso script python simultaneamente sia utilizzando subprocess.Popen o subprocess.call e le discussioni, ma risorsa non tornerà il loro corretto singoli tempi di CPU, restituirà la somma del loro tempo in tra le chiamate a getrusage; per ottenere le singole volte, esegui un piccolo wrapper python per comando per crearlo come sopra (potrebbe avviarlo dal tuo script principale), o usare il metodo time
al di sotto del quale corrisponderà al correttamente con più comandi simultanei (il tempo è fondamentalmente solo tale un involucro).
Esempio di utilizzo di time
:
import subprocess, StringIO
time_output = StringIO.StringIO()
subprocess.call(["time", "yourcommand", "youroptions"], stdout=time_output)
# parse time_output
Su Windows: È necessario utilizzare i contatori delle prestazioni (aka "aiutanti di dati di performance") in qualche modo. Ecco un C example dell'API sottostante. Per ottenerlo da Python, è possibile utilizzare uno dei due moduli: win32pdh (parte di pywin32; sample code) o pyrfcon (multipiattaforma, funziona anche su Unix; sample code).
Ognuno di questi metodi soddisfa effettivamente i requisiti della "modalità hard" di cui sopra: devono essere precisi anche con più istanze in esecuzione di processi diversi su un sistema occupato. In questo caso, potrebbero non produrre esattamente gli stessi risultati rispetto all'esecuzione di un solo processo su un sistema inattivo, poiché il cambio di processo ha un certo overhead, ma saranno molto vicini, perché alla fine ottengono i loro dati dallo scheduler del SO.
Questo deve essere multipiattaforma? In caso contrario, su quale sistema operativo dovrebbe funzionare? La maggior parte dei sistemi operativi fornisce l'accesso a diversi timer, ma quelli più accurati potrebbero richiedere privilegi elevati. –
Solo Linux va bene, la compatibilità con Windows è apprezzata ma non necessaria. –