ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 함수 및 코드 실행시간 측정하기 (timeit 모듈 사용법)
    언어/파이썬 & 장고 2019. 10. 5. 23:24

    파이썬에서는 timeit 모듈을 제공하고 있고 이 모듈을 사용하여 특정 프로젝트의 전체 실행시간이 아닌 특정 함수나 코드의 실행시간을 측정하는 방법을 소개합니다.timeit.timeit()

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

    timeit 함수의 파라미터는 아래와 같습니다.

    • stmt: 실행측정할 코드 및 함수
    • setup: stmt를 실행하기 위해 사전에 필요한 코드나 함수를 선언. setup의 실행 시간은 전체 측정 실행 시간에서 제외됨
    • timer: Timer 인스턴스
    • number: 선언한 stmt의 수행 횟수. 선언하지 않으면 기본값으로 1000000번이 실행됨

    예제

    먼저 사용 방법 예제는 아래와 같습니다.

    import timeit
    
    
    t1 = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
    print(t1)
    
    
    # 0.3018611848820001


    위 코드를 설명하자면 반복문을 100번 돌면서 '0-1-2-.....-99' 의 문자열을 만드는 행동을 10000번 실행하는 시간을 측정합니다.

    아래와 같이 콜러블을 파이썬 인터페이스로 전달할 수도 있습니다.

    import timeit
    
    
    
    
    t1 = timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)
    print(t1)
    
    # 0.19665591977536678


    위 방법은 timeit 내부에 직접적으로 선언하여 실행하는 방법입니다. 보통 코드를 작성하게 되면 함수로 만들기 때문에 아래와 같이 선언하여 수행시간을 측정할 수 있습니다.

    import timeit
    
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    t1 = timeit.timeit('test()', setup='from __main__ import test', number=10000)
    print(t1)
    
    
    # 0.3343123300001025


    만약 해당 함수를 1번만 실행한 시간을 측정하려면 number의 값을 1로 주면 됩니다.

    import timeit
    
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    t1 = timeit.timeit('test()', setup='from __main__ import test', number=1)
    print(t1)
    
    
    # 5.377409979701042e-05

    timeit.repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)

    repeat함수는 repeat 파라미터를 제외하고 timeit함수와 동일한 파라미터를 갖고 있습니다.

    • stmt: 실행측정할 코드 및 함수
    • setup: stmt를 실행하기 위해 사전에 필요한 코드나 함수를 선언. setup의 실행 시간은 전체 측정 실행 시간에서 제외됨
    • timer: Timer 인스턴스
    • number: 선언한 stmt의 수행 횟수. 선언하지 않으면 기본값으로 1000000번이 실행됨
    • repeat: timeit()함수를 반복으로 호출 할 수. 선언하지 않으면 기본값으로 5번이 실행

    repeat()은 결과가 repeat 파라미터에서 지정한 수만큼의 크기를 갖는 리스트를 반환합니다. repeat() 함수는 파라미터에서 지정한 내용대로 반복하여 결과를 리스트로 내보내 줍니다. 실행시간은 측정할 때마다 동일하지 않고 계속 다르기 때문에 repeat()을 사용하여 평균 측정시간을 낼 때 사용하기 좋습니다.

    예제

    위 함수를 10번 반복하여 수행시간을 확인하는 예제입니다.

    import timeit
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    t1 = timeit.repeat('test()', setup='from __main__ import test', number=1, repeat=10)
    print(t1)
    
    
    # [4.4689979404211044e-05, 3.570702392607927e-05, 0.00010638800449669361, 7.007492240518332e-05, 6.197404582053423e-05, 4.9708993174135685e-05, 6.294203922152519e-05, 4.0619983337819576e-05, 3.496196586638689e-05, 3.409304190427065e-05]


    아래는 10000번 실행하는 함수를 2번 반복하여 나온 결과 예제입니다.

    import timeit
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    t1 = timeit.repeat('test()', setup='from __main__ import test', number=10000, repeat=2)
    print(t1)
    
    
    # [0.3301916840719059, 0.3387007679557428]

    timeit.Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None)

    Timer 클래스는 timeit 모듈에서 사용되는 공통 클래스 입니다. 위에서 설명한 것처럼 단일 건으로 사용할 수도 있지만 Timer() 클래스에 선언한 다음, timeit()과 repeat()을 여러번 사용할 수 있습니다.

    timeit(number=1000000)

    위 Timer 클래스를 선언하고 timeit()함수에 실행 횟수만 지정하여 사용할 수 있습니다. 이 방법을 사용하면 여분의 함수 호출로 인해 타이밍 오버헤드가 약간 더 커집니다. 

    기본적으로, timeit()은 시간 측정 중에 가비지 컬렉터 기능을 일시적으로 끕니다. 이 방법의 장점은 독립적인 시간 측정이 더 잘 비교될 수 있다는 것입니다. 단점은 가비지 컬렉터가 측정되는 함수의 성능에서 중요한 요소가 될 수 있다는 것입니다.

    단점을 해결하기 위해서 가비지 컬렉터를 setup 문자열의 첫 번째 문장에서 다시 활성화할 수 있습니다.

    timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()


    예제

    import timeit
    
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    timer = timeit.Timer('test()', setup='from __main__ import test')
    t1 = timer.timeit(number=10000)
    
    print(t1)
    
    
    # 0.3503948861034587

    repeat(repeat=5, number=1000000)

    timeit.repeat()함수와 동일한 동작을 합니다.

    예제

    import timeit
    
    
    def test():
        return "-".join(str(n) for n in range(100))
    
    timer = timeit.Timer('test()', setup='from __main__ import test')
    t1 = timer.repeat(number=10000, repeat=2)
    
    print(t1)
    
    
    # [0.3324198810150847, 0.32754432293586433]

    autorange(callback=None)

    timeit()를 호출하는 횟수를 자동으로 결정합니다. 이 함수는 총 시간이 0.2초 이상이 될 때까지 timeit()을 반복적으로 호출하고, 최종 (루프 수, 해당 루프 수에 소요된 시간)을 반환하는 함수입니다. 실행 시간이 적어도 0.2초가 될 때까지 1, 2, 5, 10, 20, 50 ... 로 루프 수를 증가시키면서 timeit()을 호출합니다. callback이 주어지고 None이 아니면, 시도 다음에 두 개의 인자로 호출합니다: callback(number, time_taken).

    예제

    import timeit
    def test():
        return "-".join(str(n) for n in range(100))
    
    timer = timeit.Timer('test()', setup='from __main__ import test')
    t1 = timer.autorange()
    
    print(t1)
    
    # (10000, 0.4110312530538067)


    해당 함수는 사용하지 않아서 정확히는............

    댓글