我有这个程序来检查当前Python进程使用的CPU数量。
import os
import psutil
p = psutil.Process(os.getpid())
counter = 0
while True:
if counter % 1000 == 0:
print(p.cpu_percent())
counter += 1
输出是:
98.79987719751766
98.79981257674615
98.79975442677997
98.80031017770553
98.80022615662917
98.80020675841527
98.80027781367056
98.80038116157328
98.80055555555509
98.80054906013777
98.8006523704943
98.80072337402265
98.80081374321833
98.80092993219198
98.80030995738038
98.79962549234794
98.79963842975158
98.79916715088079
98.79930277598402
98.7993480085206
98.79921895171654
98.799154456851
从输出看,这个程序占用了我100%的CPU,而我很难理解为什么。我注意到放一个time.sleep(0.25)
会导致CPU使用率下降到零。
在我的实际应用程序中,我有一个类似的while循环,因为它正在从OpenCV读取视频并且需要保持实时,因此无法在while循环中进行休眠。
import cv2
cap = cv2.VideoCapture("video.mp4")
while True:
success, frame = cap.retrieve()
这个程序占用的CPU数量与我写的第一个程序相同,但这个程序解码视频!
如果有人可以解释一点那就太棒了。
我希望你做得很好!
当你这样做时:
while True:
if counter % 1000 == 0:
print(p.cpu_percent())
counter += 1
您实际上要求您的计算机不断处理。
它将尽可能快地增加counter
,并且每次cpu_percent
模数为1000时都会显示counter
。
这意味着您的程序将不断向CPU提供递增计数器的指令。
当你使用sleep时,你基本上会告诉OS(操作系统)你的代码在睡眠时间之前不应该执行任何新的操作。然后,您的代码将不会使CPU充满指令。
睡眠暂停执行给定的秒数。
目前使用睡眠比使用计数器更好。
import os
import psutil
import time
p = psutil.Process(os.getpid())
counter = 0
while True:
time.sleep(1)
print(p.cpu_percent())
我希望它有所帮助。
祝你有个愉快的一天,
G
你的原始循环正在做尽可能快的事情。任何正在进行纯粹CPU绑定工作的程序,没有涉及重要的阻塞操作,都会很乐意消耗整个CPU,如果CPU速度更快,它只会做更快的事情。
你的特定内容大多只是递增一个值并将其一次又一次地除以1000,这是低效的,但使它更有效,例如通过将循环更改为:
import os
import psutil
p = psutil.Process(os.getpid())
while True:
for i in range(1000): pass
print(p.cpu_percent())
删除所有除法工作并有一个更有效的加法(range
在C层完成工作),只是意味着你更快地做1000循环和print
cpu_percent
更频繁(它可能会略微降低CPU使用率,但只是因为你可能是print
ing足够的输出缓冲区填充速度快于它可以用于显示,并且你的程序可能偶尔会阻塞I / O)。
重点是,如果你告诉计算机尽可能快地做一些事情,它会。所以不要。使用sleep
;即使是一个小的(time.sleep(0.001)
)也会产生巨大的变化。
对于您的视频捕获场景,看起来这就是您想要的第一个。如果视频源产生足够的输出以占用整个CPU,那就这样吧;如果不是,并且你的代码在它开始时会阻塞,那就太好了,但是你不想为了降低CPU使用率而减慢处理速度,如果它意味着落后/丢帧。
如果您不希望它一直使用100%CPU,如果它只是一遍又一遍地检查某个条件,您可能希望在循环中添加time.sleep(numberOfSeconds)。我认为这将解决您的问题