구현을 하다보면 알고리즘 속도에 대한 고민을 된다. 이때 어떤 부분이 오래 걸리는지를 확인해야 하는데 직관적인 방법에 의한 고민을 할 수도 있지만 코드가 많아지게 되면 이를 찾아내기 쉽지가 않다
그럴 때 도움을 받을 수 있는 것이 프로파일링 (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 옵션은 분석 결과를 출력한다는 것을 나타냅니다. 실행 결과는 다음과 같습니다.
위 결과에서 각 라인에서 소요되는 시간과 메모리 사용량 등을 확인할 수 있습니다. 이를 통해 성능 최적화를 수행할 수 있습니다.
'programming > python' 카테고리의 다른 글
[PY] Python 메모리 이모저모 - 1 (0) | 2022.12.17 |
---|---|
[PY] 캡슐화 (encapsulation) - @property (0) | 2022.11.27 |
[PY] 객체지향 - 상속 (inheritance) (0) | 2022.11.24 |
[PY] 파이썬의 global과 nonlocal (0) | 2022.11.23 |
[PY] 파이썬 진수 변환 (0) | 2022.11.22 |
댓글