如何在Python中以百分比形式测量单行代码的CPU使用率?

3

我需要知道当整个程序执行时,这行特定代码加载了多少CPU:

cap.set(cv.CAP_PROP_POS_FRAMES,random_frame)

这行代码是某个程序的一部分,但我只关心这个特定的行如何加载CPU。我不知道如何准确地测量它。
更精确地说,这是我的完整代码:
import cv2 as cv
import random

cap = cv.VideoCapture('file_name.avi')

random_frame = random.randint(1,99999)

cap.set(cv.CAP_PROP_POS_FRAMES,random_frame)

ret, frame = cap.read()

cv.imshow("random_frame",frame)

while cap.isOpened():
    if cv.waitKey(1) == ord('q'):
        break
    
cap.release()
cv.destroyAllWindows()

Windows 7 操作系统


你可以使用time模块中的*perf_counter()*函数,尽管它可能无法提供你所需的粒度。 - DarkKnight
Python 的速度可能足够慢,以至于计时一个仅设置一个属性的函数调用可能几乎没有意义,但现代 CPU 可以同时运行多个指令,因此总体性能并不总是各个时间之和。而且与 CPython 解释一个函数调用相比,计时开销相当显著。即使你可以将一些低级计时(如 x86 的 rdtsc)放入 Python 解释器本身中,这也不容易。因此,你的计时代码也必须在 Python 中。 - Peter Cordes
参见编程中惯用的性能评估方法? - 你可以将其放在循环中并计时整个循环,尽管这可能会隐藏任何在实际使用中可能发生的缓存未命中开销。另一方面,如果这是您的实际代码经常执行的操作,则缓存可能已经被预热。 - Peter Cordes
由于您并没有特别询问OpenCV,而是关于如何对您的代码进行性能分析,因此我不确定这是否应该保留为“OpenCV”标签。 - Christoph Rackwitz
1个回答

0
import multiprocessing as mp
import psutil
import random
import cv2 as cv
import random

cap = cv.VideoCapture ('file_name.avi')

random_frame = random.randint (1, 99999)


def monitorFunction():
  cap.set (cv.CAP_PROP_POS_FRAMES,random_frame)

def monitor (target):
    worker_process = mp.Process(target=target)
    worker_process.start()
    p = psutil.Process(worker_process.pid)

    # log cpu usage of `worker_process` every 10 ms
    cpu_percents = []
    while worker_process.is_alive():
        cpu_percents.append(p.cpu_percent())
        time.sleep(0.01)

    worker_process.join()
    return cpu_percents

cpu_percents = monitor(target=monitorFunction)
print (cpu_percents)

这应该可以工作。


谢谢,这非常有帮助。但是:1. 在运行程序时,大多数情况下我会遇到错误:NoSuchProcess: process no longer exists (pid=12345);2. 我应该如何解释结果?因为程序执行的结果是在0.0和450.0之间的值。我猜这不是我预期的CPU使用率百分比的值。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接