본문 바로가기
programming/python

[PY] line_profiler (@profile)

by AteN 2023. 3. 4.

구현을 하다보면 알고리즘 속도에 대한 고민을 된다. 이때 어떤 부분이 오래 걸리는지를 확인해야 하는데 직관적인 방법에 의한 고민을 할 수도 있지만 코드가 많아지게 되면 이를 찾아내기 쉽지가 않다

 

그럴 때 도움을 받을 수 있는 것이 프로파일링 (profiling)이다. 프로파일링이란 프로그램의 시간 복잡도, 메모리 정보, 함수 호출 주기, 빈도 등을 분석하는 것이다

 

@profile은 파이썬에서 제공하는 성능 분석 도구인 line_profiler 모듈에서 제공하는 데코레이터입니다. 이를 이용하여 함수나 메소드의 각 라인에서 소요되는 시간, 메모리 사용량 등의 성능 정보를 확인할 수 있습니다.

 

@profile 사용하려면 먼저 line_profiler 모듈을 설치해야 합니다. 설치 방법은 다음과 같습니다.

pip install line_profiler

설치가 완료되면 분석하고자 하는 함수나 메소드에 @profile 데코레이터를 추가합니다. 그리고 kernprof 명령어를 사용하여 분석 대상 함수를 실행합니다.

 

먼저 실행할 파일을 설정합니다. 저는 test.py를 생성하여 아래의 코드를 실행합니다.

import cv2
import numpy as np


@profile
def extract_main_colors(image_path, N=6):
    panel_h = 64
    panel_w = 512
    
    image = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)
    color_source = (image[image[:, :, -1] !=0, :3]).astype(np.uint32)
    
    packed_image = color_source[:, 0] * 1e6 + color_source[:, -1] * 1e3  + color_source[:, 2]
    unique_colors, pixel_counts = np.unique(packed_image, return_counts = True)
    top_N_colors = unique_colors[np.argsort(pixel_counts)[::-1][:N]]
    
    color_panels = []
    
    for color in top_N_colors:
        b, g, r = color//1e6, color//1e3 % 1e3, color % 1e3
        color_panel = np.ones((panel_h, panel_w, 3)) * (b,g,r)
        
        color_panels.append(color_panel)
        
    color_panels = np.concatenate(color_panels, axis = 0)
    
    return color_panels.astype(np.uint8)

if __name__ == '__main__':
    extract_main_colors(image_path)

코드에서 extract_main_colors 함수의 라인에서 소요되는 시간과 메모리 사용량 등의 성능 정보를 확인하려면 다음과 같이 kernprof 명령어를 사용합니다.

kernprof -l -v test.py

-l 옵션은 line_profiler 모듈을 사용한다는 것을 나타내고, -v 옵션은 분석 결과를 출력한다는 것을 나타냅니다. 실행 결과는 다음과 같습니다.

결과에서 라인에서 소요되는 시간과 메모리 사용량 등을 확인할 있습니다. 이를 통해 성능 최적화를 수행할 있습니다.

댓글