[python] timeit 명령어 전격 해부

Yunhong Min·2021년 6월 23일
0

파이썬 코드의 성능을 시험해보고 싶을 때 간단하게 시도해볼 수 있는 방법 중 하나가 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

파일 내 function 실행

만약 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
$ 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 명령어를 사용할 때 찾아보기에 충분한 것 같다. 끝!

profile
좋아서 시작한 개발 지금은...

0개의 댓글