2016-05-03 8 views
0

У меня есть следующая программа, которая работает в течение 400 секунд, а во всем цикле while она итерации по массиву временных кодов. Когда прошедшее время выполнения программы совпадает с одним из временных кодов, оно что-то делает. Проблема заключается в том, что он выполняет итерацию по массиву временных кодов много раз в секунду, и в настоящее время он «делает вещь» несколько раз во время второй, что условие выполнено - я только хочу, чтобы это однажды делалось ... как я могу сделай это?остановить проверку, если оператор после выполнения условия

#!/usr/bin/env python3 

import time 

def get_sec(s): 
    l = s.split(':') 
    return int(l[0]) * 60 + int(l[1]) 

def sec_trim(s): 
    l = s.split('.') 
    return int(l[0]) 

times = [ 
    '00:07', 
    '00:34', 
    '00:59', 
    '01:29', 
    '02:22', 
    '02:50', 
    '03:05', 
    '03:21', 
    '04:07', 
    '04:24', 
    '04:58', 
    '05:27', 
    '06:03', 
    '06:22', 
    '06:36', 
    '06:58', 
    '07:07', 
    '07:24', 
    '07:45', 
    '08:40', 
    '08:51', 
    '09:17', 
    '09:31', 
    '09:43', 
    '10:01', 
    '10:10', 
    '10:30', 
    '11:29', 
    '11:42', 
    '12:02', 
    '12:14', 
    '12:26', 
    '12:51', 
    '13:47', 
    '13:58', 
    '14:09', 
    '14:33' 
] 



start_time = time.time() 
elapsed_time = time.time() - start_time 

while elapsed_time < 400: 
    for item in times: 
     elapsed_time = time.time() - start_time 
     if get_sec(item) == sec_trim(str(elapsed_time)): 
      print item 
     # print sec_trim(str(elapsed_time)) 
+1

Знаете ли вы о 'break' и' continue'? https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops – leekaiinthesky

ответ

2

Вместо Перебор всего списка:

  1. Поскольку список сортируется, только проверьте первый пункт.

  2. Как только достигнуто время, указанное в первом элементе, вытащите его из списка.

+0

Да. Вы можете добавить 'time.sleep (0.5)' в конце цикла, и это поможет уменьшить загрузку процессора, так как большую часть секунды вы просто проверяете время. Или, еще лучше, просто спать в остальное время до следующего раза. –

0

Я не полностью понимаю ваш вопрос, но если вы хотите, чтобы запустить свой код последовательного каждый второй вы можете использовать time.sleep('seconds')

import time 
start_time = time.time() 
elapsed_time = time.time() - start_time 
while elapsed_time < 400: 
    for item in times: 
     elapsed_time = time.time() - start_time 
     if get_sec(item) == sec_trim(str(elapsed_time)): 
      print item 
    time.sleep(1.0) 
0

Я пошел вперед и написал то, что я кладу в мои комментарии на другой ответ:

start_time = time.time() 
elapsed_time = time.time() - start_time 

# loop while we have times and we haven't run out of time 
for next_str in times: 
    if elapsed_time >= 400: 
     break 

    # if there's time to kill, go to sleep 
    elapsed_time = time.time() - start_time 
    wait_time = get_sec(next_str) - elapsed_time 
    if wait_time > 0: 
     time.sleep(wait_time) 

    # do the thing 
    print next_str 
    # print sec_trim(str(elapsed_time)) 
Смежные вопросы