运行外部命令并获取其消耗的 CPU 量

2023-12-25

很简单,我想从 Python 脚本中运行外部命令/程序,一旦完成,我还想知道它消耗了多少 CPU 时间。

Hard模式:并行运行多个命令不会导致CPU消耗结果不准确。


On UNIX:(a) 使用resource http://docs.python.org/2/library/resource.html模块(另请参阅 icktoofay 的回答),或 (b) 使用time http://linux.die.net/man/7/time命令并解析结果,或 (c) 使用/proc http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html文件系统,解析 /proc/[pid]/stat 并解析出来utime and stime字段。最后一个是 Linux 特定的。

使用示例resource:

import subprocess, resource
usage_start = resource.getrusage(resource.RUSAGE_CHILDREN)
subprocess.call(["yourcommand"])
usage_end = resource.getrusage(resource.RUSAGE_CHILDREN)
cpu_time = usage_end.ru_utime - usage_start.ru_utime

注意:不需要执行fork/execvp,subprocess.call()或其他子流程 http://docs.python.org/2/library/subprocess.html这里的方法很好,而且更容易使用。

注意:您可以使用 subprocess.Popen 或 subprocess.call 和线程同时从同一个 python 脚本运行多个命令,但资源不会返回其正确的单独 cpu 时间,它将返回调用 getrusage 之间的时间总和;要获取单独的时间,请为每个命令运行一个小 python 包装器,以按上述方式计时(可以从主脚本启动这些时间),或者使用time下面的方法will正确地处理多个同时发生的命令(时间基本上就是这样的包装器)。

使用示例time:

import subprocess, StringIO
time_output = StringIO.StringIO()
subprocess.call(["time", "yourcommand", "youroptions"], stdout=time_output)
# parse time_output

在 Windows 上:您需要以某种方式使用性能计数器(又名“性能数据助手”)。这里有一个C 示例 http://en.literateprograms.org/CPU_usage_using_performance_counters_%28C,_Windows_2000%29底层 API 的。要从 python 获取它,您可以使用两个模块之一:win32pdh http://docs.activestate.com/activepython/2.7/pywin32/win32pdh.html(pywin32 的一部分;示例代码 http://www.cac.cornell.edu/wiki/index.php?title=Performance_Data_Helper_in_Python_with_win32pdh) or pyrfcon http://code.google.com/p/pyrfcon/(跨平台,也适用于 Unix;示例代码 http://code.google.com/p/pyrfcon/source/browse/trunk/example.py).

这些方法中的任何一个实际上都满足上述“硬模式”要求:即使在繁忙的系统上运行不同进程的多个实例,它们也应该是准确的。在这种情况下,与在空闲系统上仅运行一个进程相比,它们可能不会产生完全相同的结果,因为进程切换确实有一些开销,但它们将非常接近,因为它们最终从操作系统调度程序获取数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行外部命令并获取其消耗的 CPU 量 的相关文章

随机推荐