2013-12-19 4 views
0

в этой части кода im, пытающейся собрать 100 данных (в цикле for), и я хочу, чтобы выполнение цикла цикла прошло менее 1 секунды, подождите (1-time time) sec. Как я могу это сделать ?Время выполнения и задержки python

благодаря

while(1):    
     temparray=array('i') 
     fileName = 'interval' + str(initialfreq) + '.txt' 
     temp_file = open(fileName, 'wb') 
    for z in range(100): 
      readoff = ser.readline()     
      temp_file.write(readoff) 
      readoff=int(readoff) 
      temparray.append(readoff) 
    print('biten aralik: '+str(initialfreq)) 
    general_list.write('interval'+str(initialfreq)+": "+str(mean(temparray))+'\n') 
    initialfreq= initialfreq + 1 
+0

В качестве побочного примечания вы видите, что вы смешиваете вкладки и пробелы в коде, что почти гарантированно дает вам 'IndentationError' или неправильное поведение в тех случаях, когда ничего не получается. Не делай этого. Используйте текстовый редактор, который последовательно использует пробелы, даже когда вы нажимаете вкладку, и запускайте Python с флагом '-t' или' -tt', чтобы проверить его. – abarnert

+0

im полностью noob для stackoverflow и когда im делает кодовую цитату там, и похоже, что есть ошибка отступов :) ее правильно нормально. но спасибо за ваше решение :) – cihangir

ответ

0

Перед цикла for, получить текущее время, так как t0.

После цикла for снова получите текущее время, как t1.

Затем, если t1 - t0 < 1, time.sleep(1 - (t1 - t0)).

Существует несколько различных вариантов объектов времени, которые вы можете использовать. datetime.datetime является самым простым (особенно если вам нужно отладить эту более позднюю распечатку datetime, и это сразу же понятно для человека), если вам не нужна максимальная точность. Когда вы вычитаете два объекта datetime, вы получаете объект timedelta. Итак:

t0 = datetime.datetime.now() 
for … 
t1 = datetime.datetime.now() 
td = (t1 - t0).total_seconds() 
if td < 1: 
    time.sleep(1 - td) 

Если вам нужна более высокую точность, есть функции в time модуля, которые позволяют использовать лучшие часы, которые ваша платформа поддерживает, особенно если вы на 3.3+. Смотрите функцию clock_gettime в 3.3+:.

t0 = time.clock_gettime(time.CLOCK_MONOTONIC) 
for … 
t1 = time.clock_gettime(time.CLOCK_MONOTONIC) 
td = (t1 - t0)/time.clock_getres(time.CLOCK_MONOTONIC) 
# same code as above 

CLOCK_MONOTONIC не может быть лучшими часами для вашей платформы-например, если у вас есть CLOCK_HIGHRES или CLOCK_MONOTONIC_RAW они почти всегда будут лучше. Итак, прочитайте документы, а затем проверьте, что у вас есть.

В более ранних версиях (включая все версии 2.x), вам придется выбирать между clock, perf_counter, process_time или time, которые все имеют различные компромиссы и компромиссы даже разные на разных платформах (и datetime.datetime будет уже по крайней мере так же хороши, как time), поэтому никто не может сказать вам «всегда используйте этот».

+0

Могу ли я спросить, что, как я сказал, каждый период будет 1 сек. так как вы думаете, что он может быть достаточно точным в течение 1 сек? и он не должен быть мультиплатформенным. я буду использовать только win7, а моя версия python - 2.7.6. спасибо – cihangir

+0

@cihangir: IIRC, в Windows, 'time' и' datetime.datetime' обычно основаны на тактовой частоте 20 мс, поэтому вы получите где-нибудь от 0,98 секунды до 1,02 секунды. И 'sleep' основан на процессорных срезах времени, которые находятся где угодно от 20-200 мс, так что это так хорошо, как вы можете получить, так и не получив фантазии. – abarnert

+0

хорошо, большое спасибо за вашу помощь :) – cihangir

0
import time 

now = time.time() 
future = now + 1 
for z in range(100): 
    readoff = ser.readline()     
    temp_file.write(readoff) 
    readoff=int(readoff) 
    temparray.append(readoff) 
time_span = future - time.time() 
if time_span > 0: 
    print 'sleeping for %g' %(1-time_span) 
    time.sleep(1-time_span) 
Смежные вопросы