Python 코드 프로파일링

Fariba Laiq 2023년1월30일
  1. cProfile을 사용하여 Python 코드 프로파일링
  2. SnakeViz를 사용하여 Python에서 프로필 결과 시각화
Python 코드 프로파일링

프로파일링은 스크립트를 실행해야 하는 시간과 실행 빈도에 대한 통계를 표시하는 기술입니다. 이를 통해 코드의 어느 부분을 최적화하고 프로그램을 효율적으로 만들어야 하는지 이해할 수 있습니다.

cProfile을 사용하여 Python 코드 프로파일링

cProfile은 프로그램의 실행 시간을 측정하고 메서드가 얼마나 자주 호출되는지 보여주는 Python의 내장 모듈입니다. Python 코드를 프로파일링하기 위해 run() 메소드 호출에서 코드 또는 메소드 이름을 문자열 인수로 작성합니다.

프로그램의 총 실행 시간과 함께 특정 메서드가 실행되는 데 걸리는 시간도 표시됩니다.

다음 코드에서 run() 메서드 호출에서 문자열로 간단한 비교 작업을 작성했습니다. 출력은 해당 코드의 모든 통계를 보여줍니다.

예제 코드:

import cProfile

cProfile.run("0 < 1")

출력:

3 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

이제 백엔드에서 많은 메소드 호출로 상당한 시간이 소요되는 코드를 작성해 보겠습니다. 다음 코드에서는 목록에 숫자를 추가하는 중첩 루프가 포함된 메서드를 만들었습니다.

이 메서드를 프로파일링하기 위해 이름을 run() 메서드에 전달합니다. 출력은 이 코드에 대한 모든 통계를 보여줍니다.

예제 코드:

import cProfile


def func():
    num = []
    for i in range(1, 100):
        for j in range(1, 100):
            num.append(j)


cProfile.run("func()")

출력:

9805 function calls in 0.009 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.006    0.006    0.009    0.009 <ipython-input-3-d9419f0448d8>:2(func)
        1    0.000    0.000    0.009    0.009 <string>:1(<module>)
        1    0.000    0.000    0.009    0.009 {built-in method builtins.exec}
     9801    0.003    0.000    0.003    0.000 {method 'append' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

SnakeViz를 사용하여 Python에서 프로필 결과 시각화

‘SnakeViz’는 프로파일링 시각화를 위한 웹 기반 도구입니다. 우리는 쉽게 설치하고 사용할 수 있습니다.

pip install snakeviz

다음 코드의 결과를 프로파일링하고 시각화한다고 가정합니다. Python 환경의 py 파일에 코드를 저장해야 합니다.

우리는 각각 1000번 실행하고 일부 산술 연산을 수행하는 루프를 포함하는 세 가지 함수를 가지고 있습니다.

예제 코드:

def func():
    a = 1
    b = 2
    for i in range(1, 1000):
        a += b


def func2():
    a = 1
    b = 2
    for i in range(1, 1000):
        a -= b


def func3():
    a = 1
    b = 2
    for i in range(1, 1000):
        a *= b


func()
func2()
func3()

다음 명령을 사용하여 결과를 프로파일링하고 시각화합니다.

python -m cProfile -o temp.dat My_Script.py
snakeviz temp.dat

출력:

SnakeViz 고드름

SnakeViz 선버스트

Icicle(기본값) 및 Sunburst는 SnakeViz에서 제공하는 두 가지 시각화 모드입니다. Icicle의 경우 직사각형의 너비는 함수에 소요된 시간을 나타냅니다.

호의 각도 범위는 Sunburst로 전환하는 경우 실행 시간을 나타냅니다. 스타일 옵션을 사용하여 두 가지 스타일을 변경할 수 있습니다.

작가: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn

관련 문장 - Python Profile