Python 코드 실행시간을 측정하는 방법도 Java와 크게 다르지 않다.
1. time.time() 이용하기
가장 간단한 방법이다.
time.time()을 사용하여 시작 시간과 종료 시간을 저장해 그 차이를 계산하는 방법이다.
start_time = time.time()
# 작업 코드
end_time = time.time()
print('코드 실행 시간: %20ds' % (end_time - start_time))
단위는 초 단위이다.
파이썬에서 가장 마음에 드는 부분이 이렇게 초 단위를 사용한다는 점이다.
그런데 만약에 1초도 안 걸리는 코드의 실행시간을 측정하고 싶다면??
start_time = time.time_ns()
# 작업 코드
end_time = time.time_ns()
print('코드 실행 시간: %20ds' % (end_time - start_time))
그냥 단순하게 time() 대신 time_ns()를 사용하면 ns 단위의 결과를 얻을 수 있다.
2. time.perf_counter() 이용하기
time.time()과 time.perf_counter()의 관계는 아마 Java에서 currentTimeMillis()와 nanoTime()의 관계와 비슷한 것 같다.
time()은 UTC 시간인 1970년 1월 1일 자정부터 현재까지 흐른 시간을 반환한다.
perf_counter()는 '성능 카운터(performance counter), 즉 짧은 지속 시간을 측정하는 가장 높은 해상도를 가진 시계의 값을 (소수부가 있는 초로) 반환합니다.'라고 문서에 나와있다.
start_time = time.perf_counter()
# 작업 코드
end_time = time.perf_counter()
print('코드 실행 시간: %20ds' % (end_time - start_time))
사용 방법은 time() 대신 perf_counter()를 사용하면 끝이다.
역시나 초 단위로 결과를 반환하고, ns 단위의 결과를 얻고 싶다면 perf_counter_ns()를 사용하면 된다.
3. time.process_time() 이용하기
time.process_time()은 위에서 사용한 것들과는 성격이 조금 다르다.
time()과 perf_counter()는 실제로 시작하고 종료한 시간까지의 stop watch와 같은 역할이지만,
process_time()은 '현재 프로세스의 시스템과 사용자 CPU 시간 합계의 값을 (소수부가 있는 초로) 반환합니다. 수면 중 경과 시간은 포함되지 않습니다.'라고 문서에 나와있다.
즉, CPU가 실제로 해당 프로세스에 대해 작업한 시간만을 측정한다.
start_time = time.process_time()
# 작업 코드
end_time = time.process_time()
print('코드 실행 시간: %20ds' % (end_time - start_time))
사용 방법은 위에서 봤던 방법과 다르지 않고, 역시나 초 단위를 사용하며 ns 단위의 결과를 얻고 싶다면 process_time_ns()를 사용하면 된다.
perf_counter()와 process_time()이 실제로 어떻게 다른 결과를 나타내는지 궁금해
start_time_perf = time.perf_counter_ns()
start_time_process = time.process_time_ns()
Fibonacci(35)
end_time_process = time.process_time_ns()
end_time_perf = time.perf_counter_ns()
print('코드 실행 시간 process_time: %20dns' % (end_time_process - start_time_process))
print('코드 실행 시간 perf_counter: %20dns' % (end_time_perf - start_time_perf))
재귀 함수로 구현된 피보나치수열을 구하는 함수를 호출하여 35번째 피보나치 수를 계산하는 시간을 확인해 보았다.
perf_counter를 먼저 호출했기 때문에 그 정도 시간 차이 말고는 차이가 나지 않았다.
하지만
start_time_perf = time.perf_counter_ns()
start_time_process = time.process_time_ns()
Fibonacci(35)
# 의도적으로 5초 동안 멈춤
time.sleep(5)
end_time_process = time.process_time_ns()
end_time_perf = time.perf_counter_ns()
print('코드 실행 시간 process_time: %20dns' % (end_time_process - start_time_process))
print('코드 실행 시간 perf_counter: %20dns' % (end_time_perf - start_time_perf))
위와 같이 의도적으로 time.sleep(5)를 사용하여 5초 동안 멈춘 후 시간을 비교해 보니
process_time으로 구한 시간은 아까와 별반 차이가 없으나, perf_counter는 5초가 더 느리게 결과를 얻은 것을 확인할 수 있었다.
따라서 실제로 코드의 연산 시간만 정확하게 비교해 보고 싶다면 process_time()을, 전체적으로 프로그램이 돌아가는 시간을 비교해 보고 싶으면 perf_counter()를 사용하는 것이 좋을 것 같다.
'Python' 카테고리의 다른 글
[Python] Selenium을 이용한 스크린샷 저장하기 (0) | 2021.12.01 |
---|---|
[Python] Python 반복문 개선하기 (0) | 2021.11.16 |
[Selenium] Selenium Expected Condition 정리 (2) | 2021.10.30 |
[Selenium] Selenium Waits(대기) 정리 (0) | 2021.10.25 |
[Python] 문자열 내에 리스트(배열) 안에 있는 문자가 포함되어있는지 검사하기 (0) | 2021.08.30 |