我想知道子进程需要多长时间。 我试着用
start = time.time()
subprocess.call('....')
elapsed = (time.time() - start)
然而,它不是很准确(不确定与多进程或其他相关) 有没有更好的方法可以获得子流程真正花费多少时间?
谢谢!
答案 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)