Python

[Python] Python 코드 실행시간 측정하기

메바동 2021. 11. 12. 23:08
728x90

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()를 사용하는 것이 좋을 것 같다.

728x90