HOWTO · Python
Python의 타이머 함수
이 튜토리얼은 파이썬 코드의 실행 시간을 모니터링하고 분석하는 방법을 보여줍니다.
이 페이지의 내용
대부분의 경과 시간 측정에는 time.perf_counter()를 사용하고, 현재 프로세스가 사용한 CPU 시간을 알고 싶을 때는 time.process_time()을 선택하세요. time 모듈은 시스템 시각의 타임스탬프를 얻는 time.time()과 시스템 시각 조정의 영향을 받지 않아야 하는 경과 시간 측정용 time.monotonic()도 제공합니다. 각 측정 패턴에서는 시작 시각을 기록하고, 작업을 실행한 다음, 종료 시각을 기록해 시작 시각을 종료 시각에서 빼면 됩니다. 아래 예제는 측정 방법을 보여 주기 위한 것으로, 측정 시간은 실행 환경과 실행할 때마다 달라집니다.
time.time()으로 시스템 시각 측정
time.time()은 유닉스 에포크, 즉 1970년 1월 1일 00:00:00 UTC 이후의 시간을 초 단위로 반환합니다. 저장하거나 표시하거나 다른 타임스탬프와 비교할 시각이 필요할 때 사용하세요. 시스템 시계를 따르므로 운영체제나 사용자가 시각을 조정하면 반환값도 달라질 수 있습니다. 따라서 짧은 구간을 측정하는 기본 함수로는 적합하지 않습니다. 두 번 읽는 사이에 시계가 조정되면 뺄셈 결과가 왜곡될 수 있습니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import time
start = time.time()
total = sum(range(1, 1001))
end = time.time()
print(f"sum={total}")
print(f"elapsed={end - start:.6f} seconds")
첫 번째 줄에는 항상 같은 합계가 출력되고, 두 번째 줄에는 측정 시간이 출력되며 이 값은 달라질 수 있습니다. 뺄셈 결과가 의도한 작업 시간만 포함하도록, 측정할 코드를 두 번의 시각 읽기 사이에 두세요.
time.process_time()으로 CPU 시간 측정
time.process_time()은 현재 프로세스가 사용한 CPU 시간을 측정합니다. 이 값에는 잠들어 있거나 입력, 네트워크 응답 또는 다른 프로세스를 기다리는 시간이 포함되지 않습니다. 사용자가 작업이 끝나기를 기다린 시간보다 코드가 CPU를 얼마나 사용했는지 추정할 때 적합합니다. 종료 시각에서 시작 시각을 빼면 그 사이 작업에 사용된 CPU 시간이 나옵니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import time
start = time.process_time()
total = sum(number * number for number in range(100_000))
cpu_seconds = time.process_time() - start
print(f"sum={total}; CPU time={cpu_seconds:.6f} seconds")
대기 시간이 긴 작업은 CPU 시간이 실제 경과 시간보다 훨씬 짧을 수 있습니다. 이 차이는 계산 시간과 대기 시간을 구분하는 데 유용하지만, 프로세스가 무엇을 기다렸는지까지 알려 주지는 않습니다.
time.perf_counter()로 경과 시간 측정
time.perf_counter()는 경과 구간을 측정하기 위한 고해상도 단조 시계입니다. 기준점은 정해져 있지 않으므로 개별 값을 날짜나 타임스탬프로 해석하지 말고, 두 번 읽은 값의 차이를 사용하세요. 프로세스 CPU 시간과 달리 경과 시간에는 잠들거나 기다리는 시간이 포함됩니다. 짧은 함수와 긴 작업 모두에 사용할 수 있으며, 정밀도가 높다고 해서 작은 프로세스에만 사용해야 하는 것은 아닙니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import time
start = time.perf_counter()
time.sleep(0.1)
elapsed = time.perf_counter() - start
print(f"elapsed={elapsed:.3f} seconds")
측정값은 요청한 대기 시간에 가까우며, 스케줄링과 시스템 부하 때문에 더 길어질 수 있습니다. 벤치마크에서는 한 번의 측정값을 보장된 결과로 여기지 말고, 비슷한 조건에서 비교할 수 있는 작업을 반복해 측정하세요.
time.monotonic()으로 경과 시간 측정
time.monotonic()도 시스템 시각이 조정되어도 뒤로 가지 않는 시계를 사용해 경과 구간을 측정합니다. 기준점은 정의되어 있지 않으므로 두 번 읽은 값의 차이만 의미가 있습니다. 시스템 시각 변경이 계산에 영향을 주면 안 되는 시간 제한이나 경과 시간 확인에 사용하세요. 외부 시각 변경에 맞춰 값을 조정하는 함수가 아니라, 구간 측정에서 그러한 변경의 영향을 받지 않는 함수입니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import time
start = time.monotonic()
time.sleep(0.1)
elapsed = time.monotonic() - start
print(f"elapsed={elapsed:.3f} seconds")
유닉스 타임스탬프가 필요하면 time.time(), 프로세스가 사용한 CPU 시간을 측정하려면 time.process_time(), 일반적인 경과 시간을 측정하려면 time.perf_counter()를 선택하세요. 시스템 시각이 바뀌어도 구간 측정이나 시간 제한이 안정적이어야 한다면 time.monotonic()을 사용하세요. 어떤 함수를 쓰든 두 번의 시각 읽기 사이에 둔 코드가 측정 범위를 결정합니다.