2013-05-22 5 views
11

Je voudrais savoir combien de temps dure le sous-processus. Je essayé d'utilisercombien de temps passe le sous-processus python

start = time.time() 
subprocess.call('....') 
elapsed = (time.time() - start) 

Cependant, il est pas très précis (pas sûr lié à plusieurs processus ou STH autre) Y at-il une meilleure façon que je peux obtenir combien de temps la dépense vraiment sous-processus?

Merci!

Répondre

8

Cela dépend du temps que vous voulez; temps écoulé, mode utilisateur, mode système?

Avec resource.getrusage, vous pouvez interroger le mode utilisateur et l'heure du mode système des enfants du processus en cours. Cela ne fonctionne que sur les plates-formes UNIX (comme par exemple Linux, BSD et OS X):

import resource 
info = resource.getrusage(resource.RUSAGE_CHILDREN) 

Sur Windows, vous devrez probablement utiliser ctypes pour obtenir des informations équivalentes de l'API WIN32.

+0

merci! C'est très instructif! :) – Frost

+0

cette réponse semble bien pour chronométrer le code python, mais si nous exécutons un sous-processus, cela peut ne pas être précis, puisque Popen.wait() utilise une boucle occupée. [https://docs.python.org/dev/library/subprocess.html#subprocess.Popen.wait] – ggg

+0

@ggg Vous ne savez pas si c'est vraiment un problème: Popen.wait() doit s'exécuter dans le processus en cours. Par conséquent, l'utilisation des ressources des processus enfants ne doit pas être affectée. – Steohan

6

Ceci est plus précis:

from timeit import timeit 
print timeit(stmt = "subprocess.call('...')", setup = "import subprocess", number = 100) 
2

Il m'a fallu un peu de temps pour implémenter la solution de Roland en raison de l'ennui de passer du code python sous forme de chaînes, alors j'ai pensé partager un exemple de travail.

Ce script lit un programme externe dans le répertoire de travail et redirige sa sortie standard et son erreur standard vers des fichiers.

from timeit import timeit 

reps = 500 
stdout = open("add_numbers_outputs.log", 'w') 
stderr = open("add_numbers_errors.log", 'w') 
external_command = "./add_numbers" 
parameter = str(1000000) # one million 

call_arguments = """[ 
     '%s', 
     '%s'], # pass additional parameters by adding elements to this list 
     stdout=stdout, 
     stderr=stderr 
""" % (external_command, parameter) 

print "Timing external command "+external_command+" with parameter "+parameter 

time_taken = timeit(stmt = "subprocess.call(%s)" % call_arguments, 
     setup = """import subprocess; 
stdout = open("add_numbers_outputs.log", 'w'); 
stderr = open("add_numbers_errors.log", 'w') 
""", 
     number = reps)/reps 

print "Average time taken for %s repetitions: %f seconds" % (reps, time_taken) 
+0

Si cela rend votre code plus facile, vous pouvez passer une fonction à 'timeit()' et éviter de mettre du code Python dans les chaînes. –

Questions connexes