我想计算子流程需要多长时间。我试着用
start = time.time()
subprocess.call('....')
elapsed = (time.time() - start)
但是它不是很准确(不确定与多进程或其他有关)有没有更好的方法可以获得子进程真正花费的时间?
谢谢!
我想计算子流程需要多长时间。我试着用
start = time.time()
subprocess.call('....')
elapsed = (time.time() - start)
但是它不是很准确(不确定与多进程或其他有关)有没有更好的方法可以获得子进程真正花费的时间?
谢谢!
这取决于你想要什么时间;经过时间,用户模式,系统模式?
resource.getrusage
可以查询当前进程子进程的用户模式和系统模式时间。这仅适用于 UNIX 平台(例如 Linux、BSD 和 OS X):
import resource
info = resource.getrusage(resource.RUSAGE_CHILDREN)
在 Windows 上,您可能必须使用ctypes
从 WIN32 API 获取等效信息。
这更准确:
from timeit import timeit
print timeit(stmt = "subprocess.call('...')", setup = "import subprocess", number = 100)
由于将 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)