Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取python子流程花费的时间_Python_Python 2.7 - Fatal编程技术网

获取python子流程花费的时间

获取python子流程花费的时间,python,python-2.7,Python,Python 2.7,我想计算一下子流程需要多长时间。 我试着用 start = time.time() subprocess.call('....') elapsed = (time.time() - start) 但是它不是很准确(不确定是否与多进程或其他相关) 有没有更好的方法可以得到子流程实际花费的时间 谢谢大家! 这更准确: from timeit import timeit print timeit(stmt = "subprocess.call('...')", setup = "import sub

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

start = time.time()
subprocess.call('....')
elapsed = (time.time() - start)
但是它不是很准确(不确定是否与多进程或其他相关) 有没有更好的方法可以得到子流程实际花费的时间

谢谢大家!

这更准确:

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

这取决于你想要什么时间;运行时间、用户模式、系统模式

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


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

由于将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)

对于python代码的计时,这个答案看起来不错,但如果我们正在运行子流程,这可能不准确,因为Popen.wait()使用一个繁忙的循环。[@ggg不确定这是否真的是一个问题:Popen.wait()应该在当前进程中运行。因此,子进程的资源使用不应该受到影响。它非常明确地说明了如何执行此操作。如果这样可以使代码更简单,您可以将函数传递给
timeit()
并避免将任何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)