Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 timeit 모듈로 작은 코드 조각의 실행 시간 측정하기

파이썬 표준 라이브러리의 timeit 모듈은 짧은 파이썬 코드 조각이 실행되는 데 걸리는 시간을 측정하기 위한 메커니즘을 제공하도록 설계되었습니다. 이 모듈은 Timer 클래스와 여러 편의 함수를 포함하고 있으며, 명령줄 인터페이스도 지원하기 때문에 프로그램 내부에서 함수를 호출하거나 터미널에서 직접 사용할 수 있습니다.

timeit() 함수

실행 시간을 측정하는 가장 간단한 방법은 다음과 같은 편의 함수를 사용하는 것입니다.

timeit.timeit(stmt, setup, number)

이 함수는 주로 두 개의 매개변수를 필요로 합니다.

  • stmt − 실행 시간을 측정할 유효한 파이썬 문장을 담고 있는 문자열입니다.

  • setup − 한 번만 실행되는 파이썬 문장으로, 주로 특정 객체나 변수를 초기화하는 용도로 사용됩니다.

두 문자열 모두 세미콜론(;)이나 줄바꿈으로 구분된 여러 문장을 포함할 수 있으며, 기본값은 pass입니다. 또한 선택적 매개변수인 number를 지정하면 stmt가 실행될 횟수를 정할 수 있습니다.

다음 예제는 0~100 범위의 숫자를 누적해서 더하는 작업을 1,000번 수행하는 데 걸리는 시간을 측정합니다.

import timeit
setupcode = "s = 0"
function = '''
for x in range(100):
s = s + x
'''
print (timeit.timeit(setup = setupcode, stmt = function, number = 1000))

여기서 function 문자열은 for 루프를 포함하며, 루프 안에서 0~100 범위의 숫자들을 더합니다. 이 문자열이 stmt 매개변수에 해당합니다. 덧셈에 필요한 변수 초기화는 setupcode 문자열이 담당합니다. timeit() 함수는 소요 시간을 초 단위로 반환합니다.

출력 결과

0.03055878530880241

Timer 클래스

먼저 Timer 객체를 생성한 다음, 그 객체의 timeit() 메서드를 호출해도 동일한 결과를 얻을 수 있습니다. 객체 지향 방식을 선호한다면 이 방법이 더 적합할 수 있습니다.

repeat() 메서드

Timer 클래스에는 timeit()을 반복적으로 호출할 수 있는 repeat() 메서드도 있습니다. 이 메서드는 모든 호출의 결과를 리스트 형태로 반환하므로, 여러 번 측정한 값을 비교하여 최적의 성능을 확인하는 데 유용합니다.

앞선 예제를 객체 지향 버전으로 작성하면 다음과 같습니다.

import timeit
setupcode = "s = 0"
function = '''
for x in range(100):
s = s + x
'''
t = timeit.Timer(setup = setupcode, stmt = function)
print (t.timeit(number = 1000))
print ('calling repeat() :',t.repeat(3,1000))

출력 결과

0.019971274194651528
calling repeat() : [0.023369810546474253, 0.020518432391765262, 0.02075439436427058]

명령줄 인터페이스

앞서 언급했듯이 timeit 모듈은 명령줄 인터페이스도 제공합니다. 파이썬 스크립트를 실행할 때 -m 옵션을 사용해 모듈 자체를 임포트하여 실행할 수 있습니다. 다음 명령줄 옵션들은 setup 문장, 실행할 코드, 반복 횟수 등 다양한 매개변수를 정의합니다.

-n N, --number = N'statement'를 몇 번 실행할지 지정
-r N, --repeat = N타이머를 몇 번 반복할지 지정 (기본값 3)
-s S, --setup = S처음에 한 번 실행할 문장 지정 (기본값 pass)
-v, --verbose원시 타이밍 결과 출력; 반복 지정 시 더 높은 정밀도 제공
-h, --help간단한 사용법 메시지 출력 후 종료

다음은 앞서 살펴본 예제 코드와 동일한 기능을 수행하는 명령줄 버전입니다.

C:\Users\acer>python -m timeit -s "s = 0" "for x in range(100): s = s + x"
10000 loops, best of 3: 22.4 usec per loop

이처럼 timeit 모듈을 활용하면 코드 성능을 객관적인 수치로 확인할 수 있어, 로직 최적화나 알고리즘 비교 시 매우 유용하게 활용할 수 있습니다.