[파이썬] 0.01초 단위로 표현되는 시계를 만들고 싶은데 시간이 느립니다. ㅠㅠ

조회수 5535회

안녕하세요. 파이썬을 공부하고 있는 학생입니다. 제가 시계를 만들어서 cmd 창에서 실행하려고 프로그램을 만들었습니다. 시간은 '02:03:12.23'과 같이 0.01초 단위로 표현되게 만들었습니다.

class Timer:

    def __init__(self):
        self._hour = 0
        self._minute = 0
        self._second = 0
        self._hundi_second = 0

    def run(self):
        while self._hour < 3:
            the_time = "{:02}".format(self._hour)+":"+ "{:02}".format(self._minute) \
+":"+ "{:02}".format(self._second) +"."+ "{:02}".format(self._hundi_second)
            print(the_time+'\r', end="")

            self._hundi_second += 1

            if self._hundi_second == 100:
                self._second += 1
                self._hundi_second = 0
            if self._second == 60:
                self._minute += 1
                self._second = 0
            if self._minute == 60:
                self._hour += 1
                self._minute = 0

            time.sleep(0.01)

            print("3시간이 되어 프로그램을 종료합니다. 감사합니다.")

if __name__ == "__main__":
    new = Timer()
    new.run()

돌아가기는 해서 참 좋았습니다만.. 기쁨도 잠시.. 조금 느린 것 같더라구요 ㅠㅠ 시간을 폰으로 같이 재니까 30초 기준 약 10초 가까이 느린 것을 확인했습니다. 생각해보면, 계산 과정이 들어가서 그런 것 같은데요. 제가 원하는 대로 구현하려면 어떤 방법을 써야할까요?? 조언 부탁드립니다. (^)

  • (•́ ✖ •̀)
    알 수 없는 사용자

3 답변

  • 이건 어떨까요? 저도 코딩을 잘하지는 못해서 대충만들어본건데... 아 python 2.x기준입니다!

    저도 처음에는

    print "{:02}:{:02}:{:02}.{:02}".format(self._hour, self._minute, self._second, self._hundi_second)
    

    식으로 해보려고했는데 말씀하신 것처럼 조금 느려지더라구요.... 그래서 아래처럼 해보았습니다!

    import time
    import datetime
    import os
    
    def cls():
        os.system('cls' if os.name == 'nt' else 'clear')
    
    default = time.time()
    while True:
        ts = time.time() - default + 3600*15
        st = datetime.datetime.fromtimestamp(ts).strftime("%H:%M:%S.%f")
        cls()
        print st
    
    

    화면에 시간을 출력 후 화면을 지운 후 다시 출력시키기 위해 cls()를 추가했구요,

    time.time()가 현재 표준시간을 받아와서, 시작시점의 시간을 빼서 00:00:00.00부터 시작하게 하려고 했는데 출력이 09:00:00.00부터 시작되길래 00을 맞춰주기위해 3600*15를 추가했습니다!

    그런데 마이크로초가 6자리가 출력되어요! 슬라이싱해주시면 될 것 같습니다

    while True:
        ts = time.time() - default + 3600*15
        st = datetime.datetime.fromtimestamp(ts).strftime("%H:%M:%S.%f")
        st = st[0:-4]
        cls()
        print st
    

    이런식으로 하시면 00:00:00.00식으로 출력됩니다! -3으로하시면 00:00:00.000이구요

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다. 만들어서 시간이 얼마나 차이가 나는지 확인해보겠습니다. :) 알 수 없는 사용자 2016.8.25 15:31
    • 질문있습니다. 왜 09:00:00.0부터 시작할까요? 이해가 잘 되지 않네요... 꼭 확인 부탁드립니다!! ㅠㅠ 알 수 없는 사용자 2016.8.25 19:48
    • 답변 늦어 죄송합니다. 자주 들어오지 않다보니... 그게 정확히따지면 그냥 9시가 아니라 1970년 01월 01일 09시인데, datetime.datetime.fromtimestamp()에서 인자로 0을 넘겨주었을 때 '0'에 해당하는 시점이 그 순간이더라구요. 음수를 넣으면 에러나구요. 아마 그 지점이 해당 기능으로 표현할 수 있는 최소 지점이라고 생각합니다. 알 수 없는 사용자 2016.8.29 16:43
  • 너무 재미있는 문제라 답변 달아 봅니다.
    문제 원인을 정확히 알고 있네요. 위에 답변으로도 문제 해결이 될것 같습니다.

    계산시간이 있어 느려진게 맞습니다. 또 time.sleep()이 오차를 더 크게 만들었네요. 암튼 이런건 문제가 되지 않습니다. 컴퓨터에 따라 빠를수도 느릴수도 있습니다. 30초에 10초 틀리다 했죠? 30초 마다 10초 더해주면 됩니다. 빠르면 빼주세요. 15초 마다 5초 추가 해도 되겠네요. 그리고 어느정도 오차는 인정해 주세요.

    아래는 잡설 입니다. 타이머와 시계는 오차 보정 방법이 틀립니다.

    컴퓨터에서 시간 오차를 맞추는 건 UTC time을 받아서 덮어 쓰면 됩니다.

    하지만 타이머는 동일메이커, 동일사양 컴퓨터에서도 조금씩 오차가 있습니다. 컴퓨터 안에 오실레이터라는게 있는데 이놈이 처리속도와 시간을 관장합니다. 이놈도 오차가 있습니다. 또 메모리 내에 실행되고 있는 프로그램도 다 틀립니다. 빠른고 정밀한 컴퓨터에서는 오차가 줄어 들겁니다.
    느린 컴퓨터에서는 오차가 커지겠죠.^ 나노 컴퓨터란게 있다는데 그걸 쓰면 오차가 거의 없을 겁니다. c언어를 사용하면 오차가 약간 줄기도 하겠네요.

    결론은 타이머에서는 오차를 보정해 주는 것이 맞습니다. 범용으로 누구나 쓸수 있게 하려면 사용전에 오차를 세팅할 수 있게 하는 것도 방법입니다. 아니면 정밀도를 낮추는 것도 방법 1/10 초 까지 표시

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 느려지는 이유가 프로그램 중지를 0.01초를 하는 코드가 있는데 문제는 0.01초마다 초를 세는 코드가 0.01초씩 멈춰버리기에 이렇게 되는겁니다

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)