Post List

2015년 9월 24일 목요일

Python : 간단한 Code의 실행시간 확인하기 (timeit)

timeit 를 사용하면 간단한 Code의 실행시간 확인이 가능합니다.
Python 3.4 기준에서 설명드리겠습니다.

https://docs.python.org/3.4/library/timeit.html#

위 API에서도 사용법이 나와 있지만 거기에 나와 있는 예제는 사용자가 생성한 method 나 다른 module 에서 정의한 type 을 사용하면 오류가 발생했습니다.

API에 보면 timeit의 definition이 정의되어 있습니다.

timeit.timeit(stmt='pass'setup='pass'timer=<default timer>number=1000000)

stmt : 실행할 code(statement)를 string 형식으로 적어주는 곳입니다.
setup : 해당 statement를 실행하기 위해 사전에 실행해야 할 code를 적어주는 곳입니다.
number : statement를 몇번 수행할 것인지 횟수를 적어주는 곳입니다.
timer는 따로 설정하지 않고 default timer 로 수행해도 됩니다.

위 parameter 들 중에 setup 부분에서 import를 해줘야지만 사용자가 생성한 method 나 사용자 정의 type (module 사용 포함) 이 가능합니다.

예를 들어서 NumPy 학습중 array 의 scalar 곱하기 연산과 일반적인 list 의 각각의 요소에 곱하기를 한 것의 시간을 비교하고자 할 경우

import numpy as np
arr = np.arange(1e7)
larr = arr.tolist()

def list_times(alist, scalar):
    for i, val in enumerate(alist):
        alist[i] = val * scalar
    return alist

위와 같이 정의를 해놓고 속도를 측정하고자 할때 아래의 방법으로 가능합니다.

>>> timeit.timeit(stmt = "arr * 1.1", setup = "from __main__ import arr", number = 1)
0.059031772193293364

>>> timeit.timeit(stmt = "list_times(larr, 1.1)", setup = "from __main__ import list_times, larr", number = 1)
1.944868012867346


setup 부분에 import 관련 구문을 적어줘야 따로 생성한 method 와 value의 사용이 가능합니다.
위 방법이 아니라 stmtsetup 을 따로 Timer 객체로 선언한 뒤에 하는 방법도 있습니다. 결과는 위와 같습니다.

>>> t = timeit.Timer("arr * 1.1", "from __main__ import arr")
>>> time = t.timeit(1)
>>> print(time)
0.055905614852235885

>>> t = timeit.Timer("list_times(larr, 1.1)", "from __main__ import list_times, larr")
>>> time = t.timeit(1)
>>> print(time)
1.8926470726594289

* 전체 예제