Ale*_*x I 12
在UNIX上:(a)使用资源模块(也见icktoofay的回答),或(b)使用time命令解析结果,或(c)使用/ proc文件系统,解析/ proc/[pid]/stat和解析utime和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
Run Code Online (Sandbox Code Playgroud)
注意:没有必要执行fork/execvp,subprocess.call()或者其他子进程方法在这里很好并且更容易使用.
注意:您可以使用subprocess.Popen或subprocess.call和threads同时从同一个python脚本运行多个命令,但是资源不会返回正确的单个cpu时间,它将返回它们在getrusage调用之间的时间总和; 为了获得单独的时间,每个命令运行一个小的python包装器,如上所述计时(可以从主脚本启动它们),或者使用time下面的方法,它可以正常使用多个同时命令(时间基本上就是这样的包装器) .
使用示例time:
import subprocess, StringIO
time_output = StringIO.StringIO()
subprocess.call(["time", "yourcommand", "youroptions"], stdout=time_output)
# parse time_output
Run Code Online (Sandbox Code Playgroud)
在Windows上:您需要以某种方式使用性能计数器(也称为"性能数据助手").这是底层API 的C示例.要从python中获取它,您可以使用以下两个模块之一:win32pdh(pywin32的一部分; 示例代码)或pyrfcon(跨平台,也适用于Unix; 示例代码).
这些方法中的任何一种实际上都满足上述"硬模式"要求:即使在繁忙系统上有多个不同进程的运行实例,它们也应该是准确的.与在空闲系统上仅运行一个进程相比,它们可能无法产生完全相同的结果,因为进程切换确实有一些开销,但它们将非常接近,因为它们最终从OS调度程序获取数据.