我在C ++中实现了一个算法,在实现中我计算了一些统计信息,比如缓存未命中,指令,分支未命中等。这些信息最后用cout
打印出来。但是,我还想知道实现使用了多少空间。我使用subprocess
如下:
result = subprocess.check_output(['/usr/bin/time', '-v','./program',input])
很遗憾,只有./program
的输出存储在result
中,而不是/usr/bin/time
的输出。以下是/usr/bin/time
的一个可能输出:
User time (seconds): 3.41
System time (seconds): 0.06
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.48
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 344016
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 72338
Voluntary context switches: 1
Involuntary context switches: 6
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
我只对Maximum resident set size (kbytes):
感兴趣。如果我能以某种方式将这个大文本存储在result
中,那么我希望我可以解析它。但输出完全不存储在result
中,只是打印出来。解决这个问题的最佳方法是什么?
答案 0 :(得分:3)
time
输出到STDERR,因此您需要将其重定向到STDOUT,或单独捕获它。来自time
command manpage:
命令完成后,时间 将消息写入标准错误 ,提供有关此程序运行的时间统计信息。
粗体斜体 强调我的。
使用stderr=subprocess.STDOUT
重定向:
result = subprocess.check_output(
['/usr/bin/time', '-v', './program', input],
stderr=subprocess.STDOUT)
或使用subprocess.run()
分别捕获两个流:
result = subprocess.run(
['/usr/bin/time', '-v', './program', input],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = result.stdout
time_output = result.stderr
subprocess.run()
是Python 3.5及更高版本中的新功能;如果您有较旧的Python版本(并考虑升级ASAP),请直接使用subprocess.Popen()
:
process = subprocess.Popen(
['/usr/bin/time', '-v', './program', input],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, time_output = process.communicate()