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


안녕하세요. 파이썬을 공부하고 있는 학생입니다. 제가 시계를 만들어서 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초 가까이 느린 것을 확인했습니다. 생각해보면, 계산 과정이 들어가서 그런 것 같은데요. 제가 원하는 대로 구현하려면 어떤 방법을 써야할까요?? 조언 부탁드립니다. (^)


조회수 1035


2 답변


좋아요
1
싫어요
채택취소하기

이건 어떨까요? 저도 코딩을 잘하지는 못해서 대충만들어본건데... 아 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이구요


  • 감사합니다. 만들어서 시간이 얼마나 차이가 나는지 확인해보겠습니다. :)    Sunghwan Park   2016.8.25 15:31     
  • 질문있습니다. 왜 09:00:00.0부터 시작할까요? 이해가 잘 되지 않네요... 꼭 확인 부탁드립니다!! ㅠㅠ    Sunghwan Park   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 초 까지 표시

  • 2017년 01월 30일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close