2013-05-22 8 views
11

Ich würde gerne mal wie lange dauert der Subprozess. Ich versuchtebekommen, wie viel Zeit Python Subprozess verbringt

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

zu verwenden, aber es ist nicht sehr genau (zu Multi-Prozess oder sth sonst nicht sicher bezogen) ist Gibt es eine bessere Art, wie ich, wie viel Zeit die subprocess verbringt wirklich bekommen?

Vielen Dank!

Antwort

8

Es hängt davon ab, welche Zeit Sie wollen; verstrichene Zeit, Benutzermodus, Systemmodus?

Mit resource.getrusage können Sie den Benutzermodus und die Systemmoduszeit der untergeordneten Prozesse des aktuellen Prozesses abfragen. Dies funktioniert nur auf UNIX-Plattformen (wie zum Beispiel Linux, BSD und OS X):

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

Unter Windows werden Sie wahrscheinlich ctypes verwenden, um entsprechende Informationen aus der Win32-API zu erhalten.

+0

danke! das ist ziemlich informativ! :) – Frost

+0

Diese Antwort sieht gut aus für Timing-Python-Code, aber wenn wir einen Subprozess ausführen, ist dies möglicherweise nicht korrekt, da Popen.wait() eine Busy-Schleife verwendet. [https://docs.python.org/dev/library/subprocess.html#subprocess.Popen.wait] – ggg

+0

@ggg Nicht sicher, ob das wirklich ein Problem ist: Popen.wait() sollte in dem aktuellen Prozess ausgeführt werden. Daher sollte die Ressourcennutzung von untergeordneten Prozessen nicht beeinflusst werden. – Steohan

6

Dies ist genauer:

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

Es hat eine Weile gedauert, Rolands Lösung zu implementieren, weil ich Python-Code als Strings umgehen musste, also dachte ich, ich würde ein funktionierendes Beispiel teilen.

Dieses Skript gibt ein externes Programm im Arbeitsverzeichnis aus und leitet seine Standardausgabe und seinen Standardfehler in Dateien um.

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

Wenn es Ihren Code einfacher machen würde, können Sie eine Funktion an 'timeit()' übergeben und vermeiden, dass Sie Python-Code in Strings einfügen müssen. –