20

我想计算子流程需要多长时间。我试着用

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

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

谢谢!

4

3 回答 3

13

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

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

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

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

于 2013-05-22T21:08:00.387 回答
7

这更准确:

from timeit import timeit
print timeit(stmt = "subprocess.call('...')", setup = "import subprocess", number = 100)
于 2013-05-22T20:51:25.253 回答
3

由于将 python 代码作为字符串传递很烦人,我花了一点时间来实现 Roland 的解决方案,所以我想我会分享一个工作示例。

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

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)
于 2013-07-24T07:25:24.250 回答