본문 바로가기
공부/파이썬 Python

Python cProfile 튜토리얼! (feat. 함수 별 소요시간 파악하기)

by 혼밥맨 2023. 1. 11.
반응형

Python cProfile 튜토리얼! (feat. 함수 별 소요시간 파악하기)

cProflie을 활용함으로써 print time으로 타임 프린트 찍지 않고 함수 별 소요 시간을 알아보자. cProfile 내에서 함수를 실행하면 함수별 소요시간을 간단히 확인할 수 있다.

Required Libraires (필요 라이브러리)

 1) time

 2) cProflie

https://docs.python.org/3/library/profile.html

 3) pstats

cProfiles이란

 - cProfile 및 프로필은 Python 프로그램의 결정론적 프로파일링을 제공합니다. 프로필은 프로그램의 다양한 부분이 실행되는 빈도와 기간을 설명하는 일련의 통계입니다. 이러한 통계는 pstats 모듈을 통해 보고서로 형식화할 수 있습니다.

Install Libraries (라이브러리 설치하기)

1
2
pip install cProflie
pip install pstats
cs

Importing Libraries (라이브러리 임포트하기)

1
2
3
import cProflie
import pstats
import time
cs

 

무작위 함수를 여러 개 작성한다. 함수 별 소요 시간을 확인하기 위함이다. 

1) add 함수

 - 두 개의 매개변수의 합을 반환하는 함수

 

2) fact 함수

 - 매개변수 n의 팩토리얼을 반환하는 함수

 

3) do_stuff() 함수

 - 0부터 999,999까지의 각 숫자의 제곱 값을 포함하는 리스트를 반환하는 함수

 

4) waste_time() 함수

 - 5초 sleep하고 Hello를 출력하는 함수

 

각 함수 별 소요시간은 어떻게 될까?

1
2
3
4
5
with cProfile.Profile() as profile:
    print(add(1005000))
    print(fact(70000))
    print(do_stuff())
    waste_time()
cs

cProfile 안에서 함수들을 실행시키자.

 

기왕이면 프로그램이 실행될 때 자동적으로 모든 것이 실행될 수 있도록 만들자 using magic function in Python.

1
2
3
4
5
6
if __name__ == "__main__":
    with cProfile.Profile() as profile:
        print(add(1005000))
        print(fact(70000))
        print(do_stuff())
        waste_time()
cs

 

함수 별 소요시간을 확인하기 위해 stats을 출력하자.

1
2
3
results = pstats.Stats(profile)
results.sort_stats(pstats.SortKey.TIME)
results.print_stats()
cs

결과

waste_time 함수가 5초로 가장 많은 시간을 소비했다.

 

 

Full Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import cProfile
import pstats
import time
 
def add (x,y):
    resulting_sum = 0
    resulting_sum += x
    resulting_sum += y
    return resulting_sum
 
 
def fact(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result
 
 
def do_stuff():
    result = []
    for x in range(1000000):
        result.append(x**2)
    return result
 
 
def waste_time():
    time.sleep(5);
    print("Hello")
 
 
if __name__ == "__main__":
    with cProfile.Profile() as profile:
        print(add(1005000))
        print(fact(70000))
        print(do_stuff())
        waste_time()
 
    results = pstats.Stats(profile)
    results.sort_stats(pstats.SortKey.TIME)
    results.print_stats()
cs

 

반응형

댓글