복붙노트

[PYTHON] Python line_profiler 코드 예제

PYTHON

Python line_profiler 코드 예제

파이썬의 line_profiler를 실행하여이 질문에 대한 답에서 주어진 형식으로 라인 실행 시간을 얻는 방법을 파악하려고합니다.

나는 모듈을 설치하고 LineProfiler 객체를 아래와 같이 호출하지만, 출력은 한 줄에 한 줄로 요약되어 있습니다.

어떤 아이디어? 또한, 함수 밖의 numbers = [random.randint (1,100) in i (range) (1000)] 행의 시간을 얻으려면 어떻게해야합니까?

from line_profiler import LineProfiler
import random

def do_stuff(numbers):

    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
profile = LineProfiler(do_stuff(numbers))
profile.print_stats()
[] Timer unit: 3.20721e-07 s

해결법

  1. ==============================

    1.line_profiler 테스트 케이스 (GitHub에 있음)에는 Python 스크립트 내에서 프로파일 데이터를 생성하는 방법에 대한 예제가 있습니다. 프로파일 링하려는 함수를 랩 한 다음 원하는 함수 인수를 전달하는 랩퍼를 호출해야합니다.

    line_profiler 테스트 케이스 (GitHub에 있음)에는 Python 스크립트 내에서 프로파일 데이터를 생성하는 방법에 대한 예제가 있습니다. 프로파일 링하려는 함수를 랩 한 다음 원하는 함수 인수를 전달하는 랩퍼를 호출해야합니다.

    from line_profiler import LineProfiler
    import random
    
    def do_stuff(numbers):
        s = sum(numbers)
        l = [numbers[i]/43 for i in range(len(numbers))]
        m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    
    numbers = [random.randint(1,100) for i in range(1000)]
    lp = LineProfiler()
    lp_wrapper = lp(do_stuff)
    lp_wrapper(numbers)
    lp.print_stats()
    

    산출:

    Timer unit: 1e-06 s
    
    Total time: 0.000649 s
    File: <ipython-input-2-2e060b054fea>
    Function: do_stuff at line 4
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         4                                           def do_stuff(numbers):
         5         1           10     10.0      1.5      s = sum(numbers)
         6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
         7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    

    프로필에 추가 기능 추가

    또한 프로파일 링 할 추가 기능을 추가 할 수 있습니다. 예를 들어 두 번째 호출 함수가 있고 호출 함수 만 래핑하면 호출 함수의 프로파일 결과 만 표시됩니다.

    from line_profiler import LineProfiler
    import random
    
    def do_other_stuff(numbers):
        s = sum(numbers)
    
    def do_stuff(numbers):
        do_other_stuff(numbers)
        l = [numbers[i]/43 for i in range(len(numbers))]
        m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    
    numbers = [random.randint(1,100) for i in range(1000)]
    lp = LineProfiler()
    lp_wrapper = lp(do_stuff)
    lp_wrapper(numbers)
    lp.print_stats()
    

    위 코드는 호출하는 함수에 대해서만 다음과 같은 프로파일 출력을 생성합니다 :

    Timer unit: 1e-06 s
    
    Total time: 0.000773 s
    File: <ipython-input-3-ec0394d0a501>
    Function: do_stuff at line 7
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         7                                           def do_stuff(numbers):
         8         1           11     11.0      1.4      do_other_stuff(numbers)
         9         1          236    236.0     30.5      l = [numbers[i]/43 for i in range(len(numbers))]
        10         1          526    526.0     68.0      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    

    이 경우 다음과 같이 프로파일에 추가 함수를 추가 할 수 있습니다.

    from line_profiler import LineProfiler
    import random
    
    def do_other_stuff(numbers):
        s = sum(numbers)
    
    def do_stuff(numbers):
        do_other_stuff(numbers)
        l = [numbers[i]/43 for i in range(len(numbers))]
        m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    
    numbers = [random.randint(1,100) for i in range(1000)]
    lp = LineProfiler()
    lp.add_function(do_other_stuff)   # add additional function to profile
    lp_wrapper = lp(do_stuff)
    lp_wrapper(numbers)
    lp.print_stats()
    

    산출:

    Timer unit: 1e-06 s
    
    Total time: 9e-06 s
    File: <ipython-input-4-dae73707787c>
    Function: do_other_stuff at line 4
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         4                                           def do_other_stuff(numbers):
         5         1            9      9.0    100.0      s = sum(numbers)
    
    Total time: 0.000694 s
    File: <ipython-input-4-dae73707787c>
    Function: do_stuff at line 7
    
    Line #      Hits         Time  Per Hit   % Time  Line Contents
    ==============================================================
         7                                           def do_stuff(numbers):
         8         1           12     12.0      1.7      do_other_stuff(numbers)
         9         1          208    208.0     30.0      l = [numbers[i]/43 for i in range(len(numbers))]
        10         1          474    474.0     68.3      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
    

    참고 :이 방법으로 프로파일에 함수를 추가 할 때 프로파일 된 코드를 변경할 필요가 없습니다 (즉, @profile 데코레이터를 추가 할 필요가 없음).

  2. ==============================

    2.설명서에 설명 된대로 :

    설명서에 설명 된대로 :

    do_stuff 함수를 @profile으로 꾸미고 실행하려고합니다.

    kernprof.py -v -l script_to_profile.py
    

    주석 된 출력을 터미널에 인쇄 할 수 있습니다. 프로필 또한 script_to_profile.py.lprof에 기록되며 나중에 출력을 다시 만들 수 있습니다.

    python -m line_profiler script_to_profile.py.lprof
    
  3. from https://stackoverflow.com/questions/22328183/python-line-profiler-code-example by cc-by-sa and MIT license