[PYTHON] Python line_profiler 코드 예제
PYTHONPython 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.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.설명서에 설명 된대로 :
설명서에 설명 된대로 :
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
from https://stackoverflow.com/questions/22328183/python-line-profiler-code-example by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 빠른 문자열 배열 - Cython (0) | 2018.11.17 |
---|---|
[PYTHON] 영구적 인 파이썬 하위 프로세스 (0) | 2018.11.17 |
[PYTHON] IndirectObject 추출을위한 pyPdf (0) | 2018.11.17 |
[PYTHON] matplotlib 플롯에서 저장 버튼이 작동하지 않는 이유는 무엇입니까? (0) | 2018.11.17 |
[PYTHON] is_authenticated ()가 TypeError를 발생시킵니다. TypeError : 'bool'객체를 호출 할 수 없습니다. [duplicate] (0) | 2018.11.17 |