Самый эффективный способ вести учет последних событий - PullRequest
0 голосов
/ 06 июня 2019

Мне нужен живой счетчик определенного события, которое произошло в последние X МИНУТ.

Приведенный ниже псевдокод выполняет то, что я пытаюсь сделать, но очень неэффективно.Если я сделаю WINDOW 10 минут (600 секунд) и произойдет много событий, приведенный ниже код станет тяжелым для запуска!

import time
import random

WINDOW = 20 #time, in seconds, for which we want to sum events before they expire

event = list()

while True:
    #REMOVE FROM THE `event` list the elements more than 20 seconds old
    event = [i for i in event if i+WINDOW>time.time()]

    # Randomly make events happen
    if random.randint(1,100)<50:
        event.append((time.time()))
    time.sleep(.5)

    #Once every 10 seconds, print on screen the number of events that happened in the past 20 seconds
    if round(time.time()) % 10 ==0:
        print(f'We have {len(event)} events in the past {WINDOW} seconds')
        time.sleep(1)

1 Ответ

1 голос
/ 06 июня 2019

Попробуйте отменить итерацию и сократить список, когда будет найдено первое старое событие:

tim=time.time()  # called only once
for idx in range(len(events)-1,-1,-1):
    if events[idx]+WINDOW<= tim:
        events[:idx+1]=""
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...