得到python子进程花费的时间

时间:2013-05-22 20:46:57

标签: python python-2.7

我想知道子进程需要多长时间。 我试着用

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

然而,它不是很准确(不确定与多进程或其他相关) 有没有更好的方法可以获得子流程真正花费多少时间?

谢谢!

3 个答案:

答案 0 :(得分:10)

这取决于你想要的时间;经过时间,用户模式,系统模式?

使用resource.getrusage,您可以查询当前进程子节点的用户模式和系统模式时间。这仅适用于UNIX平台(例如Linux,BSD和OS X):

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

在Windows上,您可能必须使用ctypes从WIN32 API获取等效信息。

答案 1 :(得分:6)

这更准确:

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

答案 2 :(得分:3)

我花了一些时间来实现Roland的解决方案,因为将python代码作为字符串传递令人讨厌,所以我想我会分享一个有效的例子。

此脚本对工作目录中的外部程序进行计时,并将其标准输出和标准错误重定向到文件。

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)