2015-01-07 5 views
0

У меня возникли проблемы с подходящим счетчиком времени для моего скрипта.Подсчитать время между сообщениями CANBUS

timeit.timeit() замедляет производительность слишком много, время.clock постоянно увеличивается (как это происходит, так как это приводит к увеличению времени нарастания времени) и использование встроенного метода синхронизации из потока данных обеспечивает непоследовательные результаты.

См. Нижеприведенный код с двумя моими попытками.

#!/usr/bin/python 

import subprocess,time, timeit 
import re, os, pprint, math 
from collections import defaultdict 
from Tkinter import * 

DICT = {} 
COUNT = defaultdict(int) 
CURRSTAMP = 0 

def RECEIVE(COMMAND): 
    PROCESS = subprocess.Popen(COMMAND, stdout=subprocess.PIPE) 
    LINES = iter(PROCESS.stdout.readline, "") 
    try: 
     START = time.clock() - constantly increases and does not set back to 0 after iteration 
     #TIMER = "0" 
     for LINE in LINES: 
      if re.match(r"^\d+.*$",LINE): 
       SPLITLINE = LINE.split() 
#    CURRSTAMP = float(TIMER) 
       del SPLITLINE[1:4] 
       TIMER = SPLITLINE[0] 
    #   TIMING =(float(TIMER) - CURRSTAMP) * 1000 
       IDENTIFIER = SPLITLINE[1] 
       COUNT[IDENTIFIER] += 1 
       END = time.clock() 
       TIMING = (END - START) *1000 
       DLC = SPLITLINE[2] 
       HEXBITS = SPLITLINE[3:] 
       DICT[IDENTIFIER] = [DLC, HEXBITS, COUNT[IDENTIFIER],TIMING] 
       time.sleep(0.005) 
       for IDENTIFIER, HEXBITS in DICT.items(): 
        os.system("clear") 
        pprint.pprint(DICT, width = 150) 
     START = 0 
    except KeyboardInterrupt: 
     pass 

time.clock(), кажется, скорость выполнения, мне нужно, но я должен быть что-то отсутствует, поскольку это увеличивает на .10 на каждом итератора.

ДАННЫЕ:

receivetest Version "Release_20090203_n" (www.peak-system.com) 
------- Copyright (C) 2004-2009 PEAK System-Technik GmbH ------ 
receivetest comes with ABSOLUTELY NO WARRANTY.  This is free 
software and you are welcome to redistribute it under certain 
conditions. For details see attached COPYING file. 

receivetest: device node="/dev/pcan32" 
      Only standard frames are accepted, init with 500 kbit/sec. 
receivetest: driver version = Release_20141017_n 
8827710.77 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8827710.546 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8827711.16 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8827711.485 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8827810.45 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8827810.514 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8827810.984 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8827811.453 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8827910.56 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8827910.525 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8827910.994 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8827911.464 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828010.66 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828010.536 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828011.5 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828011.474 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828110.77 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828110.546 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828111.16 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828111.485 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828210.45 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828210.514 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828210.984 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828211.453 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828310.184 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828310.610 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828311.80 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828311.549 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828410.66 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828410.536 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828411.5 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828411.474 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828510.77 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828510.546 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828511.16 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828511.485 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828610.88 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828610.557 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828610.984 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828611.496 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828710.98 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828710.568 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828711.37 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828711.506 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828810.109 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828810.578 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828811.48 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828811.517 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8828910.120 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8828910.546 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8828911.16 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8828911.485 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8829010.88 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829010.557 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829011.26 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829011.496 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8829110.98 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829110.568 receivetest: m s 0x00000690 8 00 18 00 00 00 83 59 1a 
8829111.37 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829111.506 receivetest: m s 0x00000691 8 01 38 9f 65 50 5a 06 00 
8829111.976 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829210.109 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829210.578 receivetest: m s 0x00000691 8 02 3f 03 67 0c 03 0a 00 
8829211.48 receivetest: m s 0x00000690 8 00 18 00 00 00 83 59 1a 
8829211.517 receivetest: m s 0x00000663 8 2f 00 62 02 00 03 0a 00 
8829211.986 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829310.120 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829310.589 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829311.58 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829311.528 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8829410.88 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829410.557 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829411.26 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829411.496 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8829425.746 receivetest: m s 0x00000688 8 02 00 00 5b 86 6a d2 ac 
8829510.141 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829510.610 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829511.37 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829511.549 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 
8829610.109 receivetest: m s 0x0000069a 8 00 00 00 00 00 83 59 1a 
8829610.578 receivetest: m s 0x0000069e 8 00 1f 5e 28 35 83 59 1a 
8829611.48 receivetest: m s 0x00000663 8 2f 00 62 02 00 83 59 1a 
8829611.517 receivetest: m s 0x00000690 8 00 18 00 28 35 83 59 1a 

Любая помощь будет оценена.

+0

Когда вы говорите, таймер - что важно? Это для уведомления пользователей, бенчмаркинга, учета? Некоторые варианты будут жизнеспособными, а другие - не в зависимости от того, что вы хотите. 'timeit' предназначен для бенчмаркинга и многократно запускает код, чтобы попытаться получить точный результат времени (следовательно,« медленный »). Если вы хотите разницу во времени настенных часов для пользователя, просто используйте разницу с предыдущим временем, чтобы выработать время на итерацию. –

+0

Кроме того, в качестве примечаний, имена переменных all-caps - действительно трудно читаемый стиль, который идет вразрез с [стандартным большинством последующих] (https://www.python.org/dev/peps/pep-0008/) , –

+0

Это отслеживание временных интервалов между сообщениями, поэтому я могу сказать, как часто или редко встречаются сообщения через – Jalcock501

ответ

1

Проблема в том, что вы получаете время начала, а затем разрабатываете разницу между этим и конечным временем каждой итерации. Вам нужно установить время начала до конца предыдущей итерации, чтобы получить время с этого момента.

start = time.clock() 
for line in lines: 
    ... 
    end = time.clock() 
    timeTaken = end - start 
    start = end 

Пример:

time: 1  2  3  4  5 
event: start  i1   i2 

Что вы делаете:

i1: ------------> (2) 
i2: ------------------------> (4) 

Что вы хотите:

i1: ------------> (2) 
i2:     -----------> (2) 
Смежные вопросы