ABOUT ME

-

Total
-
  • Python cProfile + snakeviz 런타임 시각화
    컴퓨터/파이썬 2020. 11. 4. 15:14
    728x90
    반응형

    snakeviz

     

    jiffyclub/snakeviz

    An in-browser Python profile viewer. Contribute to jiffyclub/snakeviz development by creating an account on GitHub.

    github.com

     

    1. 소개

    우선 파이썬 내장 모듈인 cProfile은 코드 실행 시간을 보는데 유용하다.

    (<string>:1(<module>)은 무시해도 좋다.)

    print(cProfile.run("bubbleSort(arr)"))
    
    ''' 결과
    	5 function calls in 2.555 seconds
    
       Ordered by: standard name
    
       ncalls  tottime  percall  cumtime  percall filename:lineno(function)
            1    0.000    0.000    2.555    2.555 <string>:1(<module>)
            1    2.555    2.555    2.555    2.555 temp.py:18(bubbleSort)
            1    0.000    0.000    2.555    2.555 {built-in method builtins.exec}
            1    0.000    0.000    0.000    0.000 {built-in method builtins.len}
            1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    '''
    

     

    snakeviz는 이 단순 출력 창으로 보는 것보다 아래처럼 예쁘게? 홈페이지에서 볼 수 있게 해 준다.

    pip install snakeviz

     

    2. 이용

    snakeviz 이용법은 파이썬 소스에서 cProfile 결과를 저장한 후,

    cProfile.run("insertSort(arr)", "result.prof")

    cmd, powershell 콘솔에서 아래를 입력하면 된다.

    그러면 자동으로 사이트가 열린다.

    snakeviz result.prof

     

    예제)

    지금까지 거품 정렬 (bubble sort)를 아래처럼 약간 최적화된 방식으로 사용했었는데,

    def bubbleSort(array):
        isSorted = False
        counter = 0
        while not isSorted:
            isSorted = True
            for i in range(len(array) - 1 - counter):
                if array[i] > array[i + 1]:
                    array[i], array[i + 1] = array[i + 1], array[i]
                    isSorted = False
    
            counter += 1
    
        return array

     

    중간에 len 함수를 실행하는 횟수가 너무 많은걸 발견했다.

    크기 5000의 랜덤 배열을 정렬했을 때, 약 4900번 넘게 부르고, 0.00035초나 잡아먹었다.

     

    그래서 아래처럼 수정하고 다시 불러봤더니

    def bubbleSort(array):  # in-place | stable
        n = len(array) - 1  # 한번만 부르기
        isSorted = False
        counter = 0
        while not isSorted:
            isSorted = True
            for i in range(n - counter):
                if array[i] > array[i + 1]:
                    array[i], array[i + 1] = array[i + 1], array[i]
                    isSorted = False
    
            counter += 1
    
        return array

     

    결과는 1번만 불렸고, 약 0.0000006초 (6e-07)가 걸렸다.

    차이는 약 0.00034초 (3e-05)에 성능엔 큰 영향을 안 미치지만,

    조금이라도 더 최적화를 하면 기분은 나쁘지 않은 것 같다.

    728x90

    '컴퓨터 > 파이썬' 카테고리의 다른 글

    파이썬 Sørensen–Dice coefficient  (0) 2020.11.05
    Python Singly Linked List 함수들  (0) 2020.11.03
    파이썬 FastAPI로 REST API 구현하기  (0) 2020.10.31

    댓글