Python/Python 모듈탐구

[Python] - 모듈탐구 time - Python 멈춰!

모듈 탐구 그 첫 번째 시간 time 함수이다. 사실 필자는 time 모듈을 사용하면서 sleep함수나 strptime 등 쓰던 함수만 쓰는 일이 다수 있지만.... 이번 기회에 time 모듈을 조금 공부하면서 아는 지식을 정리하고자 한다.


일단 용어를 정리하고 가야한다.

* 에포크(epoch) : 시간이 시작되는 시점(태초에 만물이 있을 지어니...) 플랫폼에 따라 다른데 예를 들면 유닉스는 1970년 1월 1일 00:00:00(UTC)이다. time.gmtime(0)로 알아볼 수 있다.

* UTC : 협정 세계시로, 그리니치 표준시인 GMT로 알려져 있다.

* DST : 일광 절약 시간으로 일 년 중 일부 기간 시간대를 한 시간 조정하는(서머타임)이다. 

 

먼저 에포크 이후의 시간은 time.time()으로 구할 수 있다. time.time()은 에포크 이후의 초를 나타내는 시간을 부동 소수점 숫자로 표현(뒤에 ns를 붙여서 정수로 나노초 반환 가능)한다.

>>> import time
>>> time.time()
1618071662.5779314
>>> time.time_ns()
1618071676597228800

 

클래스 : struct_time

time 모듈에 정의되며 자주 사용되는 객체는 struct_time이라는 객체이다.

이 struct_time은 다음과 같은 어트리뷰트를 가진다.

1. tm_year : 예를 들면 1998, 연도를 가리킨다.

2. tm_mon : 1-12의 달을 가리킨다.

3. tm_mday : 1-31의 달에 있을 수 있는 일자를 가리킨다.

4. tm_hour : 0-23의 시간을 가리킨다.

5. tm_min : 0-59의 분을 가리킨다.

6. tm_sec : 0-61의 초를 가리킨다.(?? 왜 61초이지?)

7. tm_yday : 1-366의 연에 있을 수 있는 일을 가리킨다.(아마 윤달 계산한 듯)

8. tm_isdst : 0,1,-1의 값을 가진다. 일광 절약 시간제가 발효 중인 경우 1 아니면 0, 모르면 -1

9. tm_zone : 시간대 이름의 약어, 필수는 아니다.

10. tm_gmtoff : UTC에서 동쪽으로 초 단위 오프셋, 필수는 아니다.

 

struct_time을 반환하는 함수

1. time.gmtime() : 에포크 이후의 초단위 시간을 tm_isdst가 0인 UTC로 반환한다.

2. time.localtime() : gmtime()과 같으나, 현지시각으로 변환한다.

3. time.strptime(Stirng) : 문자열로 시간을 맡아서 이걸 struct_time으로 반환한다.

>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=10, tm_hour=16, tm_min=22, tm_sec=27, tm_wday=5, tm_yday=100, tm_isdst=0)
>>> time.localtime()
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=22, tm_sec=31, tm_wday=6, tm_yday=101, tm_isdst=0)
>>> time.strptime("11 Apr 2021","%d %b %Y")
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=101, tm_isdst=-1)

 

struct_time → 부동소수점 실수

1. time.mktime(t) : struct_time자료형의 t를 받아들여 초를 부동소수점으로 반환한다.

>>> import time
>>> cur=time.localtime()
>>> time.mktime(cur)
1618071881.0

 

혹은 이 struct_time을 이쁜 말로 변경할 수도 있다.

1. time.asctime(t) : struct_time자료형의 t를 받아들여 ex : 'Sat Apr 10 15:42:41 2021'로 표현한다.

* 유사 함수로 time.ctime()이 있는데, 에포크 이후 초로 표현된 시간을 현지 시간으로 보인다.

2. time.strftime(format, t) : struct_time자료형을 받아들여 아래와 같은 규약으로 문자열을 생성한다.

지시자 의미
%a, %A 약식 요일, 전체 요일
%b, %B 약식 월, 전체 월
%c 적절한 날짜와 시간
%d 월중 일을 십진수(01~31)로 표현
%H, %I 각각 24, 12시간을 십진수로
%J 연중 일(001~366)을 십진수로
%m, %M 월, 분을 십진수로
%P AM, PM에 해당하는 시간값
%S 초를 십진수로
%U 연중 주번호를 십진수로(0~53)
%w 요일을 십진수로(0[일요일] ~ 6)

 

time모듈을 이용한 프로세스 실행시간의 측정

1. time.process_time() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 제외)

2. time.monotonic() : 단조 증가 시간을 부동소수점 실수로 반환한다.

3. time.perf_counter() : 프로세스의 실행시간을 부동소수점 실수로 반환한다.(time.sleep으로 스킵된 시간 포함)

* 위 함수들은 환경마다 달라지기에, 2번 호출하여 비교하는 것이 올바르다.

* 위 함수들은 뒤에 _ns를 붙여 정수의 나노초를 반환할 수 있다, ex : time.process_time_ns()

 

프로그램의 정지

Python 멈춰! 를 구현할 수 있는 time.sleep() 함수이다. time.sleep()은 아래 코드와 같이 사용되며, 호출하는 스레드를 일시 중단하는 기능을 가지고 있다.

import time
print("Python 멈춰!")
time.sleep(3)
print("3초후, 넌 이미 출력되어있다.")

위 코드의 2번째 print는 3초 후에 출력된다.

 

 

 

* time모듈에는 이 외에도 스레드의 시간을 스레드 별로 측정하게 도와주는 clock_XX함수가 있다. 궁금한 사람들은 다음의 API를 읽어보기를 바란다.

* 출처 : docs.python.org/ko/3/library/time.html

 

time — 시간 액세스와 변환 — Python 3.9.4 문서

time — 시간 액세스와 변환 이 모듈은 다양한 시간 관련 함수를 제공합니다. 관련 기능에 대해서는, datetime과 calendar 모듈도 참조하십시오. 이 모듈을 항상 사용할 수 있지만, 모든 플랫폼에서 모

docs.python.org

 


python에서 프로그램 실행시간을 측정하고, 시간에 관련된 함수와 구조체를 제공하며, 프로그램의 정지까지 제공하는 time모듈에 대해서 알아보았다. "에에? 시간에 관련해서는 datetime이 더 세련된 모듈 아닌가요><??" 모르는 소리, datetime 또한 import time as _time으로 구현되며 시작한다. 이로써 프로그램에서 우리의 시간을 다루는 능력이 더욱 향상되었기를 바란다.