파이썬 코드의 성능을 시험해보고 싶을 때 간단하게 시도해볼 수 있는 방법 중 하나가 timeit 명령어이다. 하지만 timeit 명령어를 사용할 때 마다 각 옵션이 정확한 어떤 역할을 하는지 매번 혼동이 될 때가 있다. 앞으로는 혼동을 하지 않도록 이번 기회에 정리해보자.
다음 명령어를 기준으로 해부를 시작해보겠다.
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 28.6 usec per loop
위 명령어를 실행하게 되면
(1) "-".join(str(n) for n in range(100))
코드를 10000번 실행시킨다.
(2) 10000번 실행한 시간 / 10000
을 계산 하여 평균 값을 낸다.
(3) (1) ~ (2)의 과정을 3번 반복한다.
(4) 3개의 평균 값 중에 가장 작은 값을 보여준다. best of 3: 28.6 usec per loop
위 과정을 실행하는 python timeit 모듈의 코드는 timeit.main 함수에서 확인할 수 있다
코드 실행 횟수 10000과 반복수 3은 기본값이다. 이 값을 조정하고 싶다면 다음과 같이 -n
(코드 실행 횟수)과 -r
(반복횟수) 옵션을 추가하면 된다.
$ python -m timeit -n 1000 -r 5 '"-".join(str(n) for n in range(100))'
1000 loops, best of 5: 28.3 usec per loop
반복 실행 별 코드 실행 전에 초기에 한번만 실행하고 싶은 코드가 있다면 -s
옵션을 사용하면 된다. 반복 회수(-r
)를 5로 지정되었다면 iterations = 100
코드는 총 5번 실행됨에 유의하자. 이 옵션에 넣은 코드는 시간 측정 시 포함되지 않는다.
$ python -m timeit -n 1000 -r 5 -s "iterations = 100" '"-".join(str(n) for n in range(iterations))'
1000 loops, best of 5: 28.1 usec per loop
만약 python 파일 내의 function을 실행하고 싶다면 다음과 같이 하면 된다.
loop.py 라는 파일이 있고, 해당 파일의 코드는 다음과 같이 정의 되어 있다 가정하자.
def loop(iterations):
"-".join(str(n) for n in range(iterations))
이 파일 내의 loop 함수를 실행하고 싶다면 다음과 같이 실행하면 된다.
$ python -m timeit -n 1000 -r 5 -s 'from loop import loop; iterations = 100' 'loop(100)'
1000 loops, best of 5: 21.9 usec per loop
-v
옵션: 각 반복 횟수의 결과 값을 모두 보여준다.$ python -m timeit -n 1000 -r 5 -v -s "from loop import loop" 'loop(100)'
raw times: 0.0276 0.0233 0.0229 0.0227 0.0227
1000 loops, best of 5: 22.7 usec per loop
-r
이 5이면 gc를 5번 껐다 켰다 함). 만약 gc를 enable한 상태로 코드를 돌리고 싶다면 -s
옵션에 gc.enable()
을 추가해주면 된다. 만약 자신의 코드가 python의 GC를 많이 사용하는 코드라면 정확한 성능 측정을 위하여 gc를 enable 하는 것도 고려해보자.$ python -m timeit -n 1000 -r 5 -s 'from loop import loop; iterations = 100; gc.enable()' 'loop(100)'
1000 loops, best of 5: 22.2 usec per loop
이 정도면 timeit
명령어를 사용할 때 찾아보기에 충분한 것 같다. 끝!