Неточность во времени или неэффективный код?

#python #datetime #time #stopwatch

#python #дата и время #время #секундомер

Вопрос:

В настоящее время я работаю над программой, которая будет отображать количество времени, прошедшего с определенного момента. Секундомер, если хотите.

Я наконец-то заставил свой код работать, но, как оказалось, он не очень точен. Он отстает очень быстро, на 1 или даже 2 секунды в течение первых 10 секунд запуска, я не совсем уверен, почему это так.

 #   Draw
def draw():
    stdscr.erase()
    stdscr.border()

    #   Debugging
    if debug:
        stdscr.addstr(5 , 3, "running  : %s " % running )
        stdscr.addstr(6 , 3, "new      : %s " % new )
        stdscr.addstr(7 , 3, "pureNew  : %s " % pureNew )
        stdscr.addstr(8 , 3, "paused   : %s " % paused )
        stdscr.addstr(9 , 3, "complete : %s " % complete )
        stdscr.addstr(10, 3, "debug    : %s " % debug )

    if running:
        stdscr.addstr(1, 1, ">", curses.color_pair(8))
        stdscr.addstr(1, 3, t.strftime( "%H:%M.%S", t.gmtime( timeElapsedTotal ) ) )

    elif not running:
        if new and pureNew:
            stdscr.addstr(1, 1, ">", curses.color_pair(5))
            stdscr.addstr(1, 3, t.strftime( "%H:%M.%S", timeNone ) )
        elif paused:
            stdscr.addstr(1, 3, t.strftime( "%H:%M.%S", t.gmtime( timeElapsedTotal ) ), curses.color_pair(1) )
            stdscr.addstr(1, 1, ">", curses.color_pair(3))
        else:
            stdscr.addstr(1, 1, ">", curses.color_pair(5))
            stdscr.addstr(1, 3, t.strftime( "%H:%M.%S", timeNone ) )

    stdscr.redrawwin()
    stdscr.refresh()
    return

    #   Calculations
def calc():
    global timeElapsedTotal
    if running:
        timeElapsedTotal = t.clock() - timeStart
    return

    #   Main Loop
while True:
    #   Get input from the user
    kInput = stdscr.getch()

    #   If q is pressed we close the program
    if kInput == ord('q'):
        endProg()

    #   If d is pressed we toggle 'debug' mode
    elif kInput == ord('d'):
        debug = not debug

    #   If s is pressed we stop the current run
    elif kInput == ord('s'):
        running = False
        new = True

    #   If spacebar is pressed and we are ready for a new run,
    #       we start a new run
    elif kInput == ord(' ') and new:
        running = not running
        new = not new
        pureNew = False
        timeStart = t.clock()

    #   If p is pressed and we are in the middle of a run,
    #       we pause the run
    elif kInput == ord('p') and not new:
        running = not running
        paused = not paused
        timeStart = t.clock() - timeStart

    calc()
    draw()
  

Приведенный выше код, насколько мне известно, работает так, как задумано. Я не уверен, происходит ли задержка time.clock() или это просто мой неэффективный код. Это та работа, для которой мне нужно было бы использовать потоки?

Я немного погуглил и увидел, что другие говорили о других функциях в модуле time, но ни одна из них не работала лучше для меня.

Дайте мне знать, если этой информации недостаточно или я допустил простую ошибку.

Комментарии:

1. time.clock означает разные вещи в разных операционных системах — очень раздражает, но это так. В Linux это истекшее время выполнения, а не время настенных часов, и его не следует использовать для подсчета секунд.

2. @tdelaney Хорошо, это имеет смысл. Знаете ли вы какие-либо хорошие альтернативы? Столкнусь ли я с такой же проблемой, используя модуль datetime, или это следующий шаг здесь?

3. Я не знаю, есть ли более современный способ исправить это, но в тот же день я бы проверил, работаю ли я на linux (настенные часы с высоким разрешением — time.time()) или windows (настенные часы с высоким разрешением — time.clock) platform.system() и выбрал часы оттуда.

4. Дайте мне знать, работает ли смена часов.

5. @tdelaney сработал как по волшебству. Спасибо, я ценю это.

Ответ №1:

Ну, как оказалось, решение было таким же простым, как переход с time.clock() на time.time() , как предложил tdelaney.

Похоже, мне нужно более тщательно ознакомиться с модулями по мере их использования. Спасибо за мудрость.