在python中满足有效更新计时器和检查条件

时间:2015-09-22 14:41:38

标签: python performance

这是一个每隔几分钟发出声音的简单脚本:

import pyglet
import time
from random import randint

music = pyglet.resource.media('input.wav', streaming=False)

def playSound():
    music.play()

counter = 0
random = randint(300,900)
prevTime = 0

while True:
    counter += time.time() - prevTime
    prevTime = time.time()
    if (counter>random):
        playSound()
        counter = 0
        random = randint(300,900)

按预期工作,但它使用100%CPU。有没有办法让它更有效率?这是我在这里完成的方式' python'做事的方式?

2 个答案:

答案 0 :(得分:3)

该方法取决于您是否需要脚本在等待时执行任何其他操作。如果它只需要播放文件,那么以下方法就足够了:

import pyglet
import time
import random

music = pyglet.resource.media('input.wav', streaming=False)

def playSound():
    music.play()

while True:
    time.sleep(random.randint(300, 900))
    playSound()

time.sleep将在给定的秒数内暂停脚本的执行。因此它不会使用任何CPU。

答案 1 :(得分:1)

在循环中添加time.sleep(.1)。您的循环当前很忙,因为它会尽可能快地更新current_time。添加sleep()调用允许CPU有一些喘息空间来做其他事情。

此外,time.time()逻辑可以改进,因此您只需执行一次函数调用(函数调用在Python中相对较慢):

current_time = time.time()
counter += current_time - prev_time
prev_time = current_time

或者更好的是,只需保持开始时间并比较差异(假设您正确初始化所有内容):

current_time = time.time()
if current_time - start_time > random_interval:
    play_sound()
    start_time = current_time
    random_interval = randint(300, 900)