Подтвердить что ты не робот

Сколько времени тратит подпроцесс python

Я хотел бы рассказать, сколько времени занимает подпроцесс. Я попытался использовать

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

Однако он не очень точен (не уверен, связанный с многопроцессорным или другим) Есть ли лучший способ получить, сколько времени тратит субпроцесс?

Спасибо!

4b9b3361

Ответ 1

Это зависит от того, в какое время вы хотите; прошедшее время, пользовательский режим, системный режим?

С resource.getrusage вы можете запросить пользовательский режим и время системного режима для текущих дочерних процессов. Это работает только на платформах UNIX (например, Linux, BSD и OS X):

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

В Windows вам, вероятно, придется использовать ctypes для получения эквивалентной информации из API WIN32.

Ответ 2

Это более точно:

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

Ответ 3

Мне потребовалось немного времени, чтобы реализовать решение Roland из-за недовольства передачи кода python в виде строк, поэтому я решил поделиться с вами рабочим примером.

Этот script раз использует внешнюю программу в рабочем каталоге и перенаправляет свой стандартный вывод и стандартную ошибку в файлы.

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)