모듈 탐구 그 첫 번째 시간 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
python에서 프로그램 실행시간을 측정하고, 시간에 관련된 함수와 구조체를 제공하며, 프로그램의 정지까지 제공하는 time모듈에 대해서 알아보았다. "에에? 시간에 관련해서는 datetime이 더 세련된 모듈 아닌가요><??" 모르는 소리, datetime 또한 import time as _time으로 구현되며 시작한다. 이로써 프로그램에서 우리의 시간을 다루는 능력이 더욱 향상되었기를 바란다.
'Python > Python 모듈탐구' 카테고리의 다른 글
[Python] - 모듈탐구 os - Python으로 내 컴퓨터 조작하기 (0) | 2021.04.11 |
---|---|
[Python] - 모듈탐구 pickle - 자료구조의 저장과 불러오기 (0) | 2021.04.11 |
[Python] - 모듈탐구 copy - 뭐! 모듈이 복사가 된다고? (0) | 2021.04.11 |
[Python] - 모듈탐구 base64 - == = (0) | 2021.04.11 |
[Python] - 모듈탐구 random - Python을 처음하신다구요? 그런당신을 위해 준비했습니다! (0) | 2021.04.11 |