Python 스크립트를 프로파일하려면 어떻게 해야 하나요?
프로젝트 오일러와 다른 코딩 경연대회에서는 종종 최대 실행 시간을 갖거나 특정 솔루션의 실행 속도를 자랑합니다.Python의 경우 접근 방식이 다소 엉성할 수 있습니다. 즉, 타이밍 코드를 에 추가하는 것입니다.__main__.
Python 프로그램을 실행하는 데 걸리는 시간을 프로파일링하는 좋은 방법은 무엇입니까?
Python에는 cProfile이라는 프로파일러가 포함되어 있습니다.총 실행 시간뿐만 아니라 각 함수의 시간을 개별적으로 계산하고 각 함수가 호출된 횟수를 알려주기 때문에 최적화할 위치를 쉽게 결정할 수 있습니다.
코드 내 또는 인터프리터에서 다음과 같이 호출할 수 있습니다.
import cProfile
cProfile.run('foo()')
스크립트를 실행할 때 cProfile을 호출할 수 있습니다.
python -m cProfile myscript.py
더 쉽게 하기 위해 'profile.bat'이라는 이름의 작은 배치 파일을 만들었습니다.
python -m cProfile %1
내가 해야 할 일은 뛰기만 하면 된다.
profile euler048.py
그리고 나는 이것을 안다:
1007 function calls in 0.061 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.061 0.061 <string>:1(<module>)
1000 0.051 0.000 0.051 0.000 euler048.py:2(<lambda>)
1 0.005 0.005 0.061 0.061 euler048.py:2(<module>)
1 0.000 0.000 0.061 0.061 {execfile}
1 0.002 0.002 0.053 0.053 {map}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler objects}
1 0.000 0.000 0.000 0.000 {range}
1 0.003 0.003 0.003 0.003 {sum}
편집: PyCon 2013에서 Python Profiling이라는 제목의 양호한 비디오 리소스에 대한 링크를 업데이트했습니다.
유튜브를 통해서도.
얼마 전에 당신의 Python 코드에서 시각화를 생성하는 것을 만들었습니다.편집: 이 글의 최신 릴리스인 3.3에서 작동하도록 예를 업데이트했습니다.
★★★★★★★★★★★★★★★ 이후pip install pycallgraph및 GraphViz 설치는 명령줄에서 실행할 수 있습니다.
pycallgraph graphviz -- ./mypythonscript.py
또는 코드의 특정 부분을 프로파일링할 수 있습니다.
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
중 어느 것이든 간에 '아까울 정도로 좋다'가 생성됩니다.pycallgraph.png다음과 같이 합니다.

프로파일러를 사용하는 것은 메인 스레드(기본값)에서만 작동하며, 다른 스레드를 사용하는 경우 다른 스레드에서 정보를 얻을 수 없습니다.이것은 프로파일러 매뉴얼에 전혀 기재되어 있지 않기 때문에 다소 번거로울 수 있습니다.
스레드 프로파일링도 원하는 경우 문서에서 함수를 확인할 수 있습니다.
도 있어요.threading.Thread★★★★★★★★★★★★★★★★★★:
class ProfiledThread(threading.Thread):
# Overrides threading.Thread.run()
def run(self):
profiler = cProfile.Profile()
try:
return profiler.runcall(threading.Thread.run, self)
finally:
profiler.dump_stats('myprofile-%d.profile' % (self.ident,))
그 말을 하겠습니다.ProfiledThread표준 클래스 대신 클래스.유연성이 향상될 수도 있지만, 특히 클래스를 사용하지 않는 서드파티 코드를 사용하는 경우에는 그럴 가치가 있는지 잘 모르겠습니다.
python wiki는 자원 프로파일링에 적합한 페이지입니다.http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
python 문서도 마찬가지입니다.http://docs.python.org/library/profile.html
Chris Lawlor cProfile은 훌륭한 도구이며 화면에 쉽게 인쇄할 수 있습니다.
python -m cProfile -s time mine.py <args>
또는 파일링:
python -m cProfile -o output.file mine.py <args>
PS> Ubuntu 를 사용하고 있는 경우는, 반드시 python-profile 을 인스톨 해 주세요.
apt-get install python-profiler
파일로 출력하면 다음 도구를 사용하여 시각화를 잘 볼 수 있습니다.
: 작성 도구 PyCallGraph : py py py py 。
★★★★★★★★★★★★★★★★★★:
pip install pycallgraph
실행:
pycallgraph mine.py args
표시:
gimp pycallgraph.png
파일은 원하는 볼 수 을 사용했습니다. 김프
.
점: 그래프가 너무 커서 카이로 렌더러 비트맵에 사용할 수 없습니다.0.257079까지 확장 가능
제 이미지가 유별나게 작아지거든요그래서 보통 svg 파일을 만듭니다.
pycallgraph -f svg -o pycallgraph.svg mine.py <args>
PS> 반드시 graphviz(도트 프로그램 제공)를 인스톨 해 주세요.
pip install graphviz
@maxy / @quodlibetor를 통한 gprof2dot을 사용한 대체 그래프 작성:
pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg
@Maxy의 이 답변에 대한 코멘트는 충분히 도움이 되었습니다.저는 이미 cProfile에서 생성된 .pstats 파일을 가지고 있고 pycallgraph로 재실행하고 싶지 않기 때문에 gprof2dot을 사용하여 예쁜 svgs를 얻었습니다.
$ sudo apt-get install graphviz
$ git clone https://github.com/jrfonseca/gprof2dot
$ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin
$ cd $PROJECT_DIR
$ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg
그리고 블램!
점(pycallgraph가 사용하는 것과 동일)을 사용하기 때문에 출력은 비슷합니다.gprof2dot의 정보 손실은 적다고 생각합니다만, 다만, 다음과 같습니다.
항상 어디로 가고 있는지 찾을 수 있는 가장 간단하고 빠른 방법입니다.
1. pip install snakeviz
2. python -m cProfile -o temp.dat <PROGRAM>.py
3. snakeviz temp.dat
브라우저에 원형 차트를 그립니다.가장 큰 부분은 문제 기능이다.아주 간단합니다.
나는 이 주제를 연구하다가 ScnakeViz라는 편리한 도구를 우연히 발견했다.SnakeViz는 웹 기반 프로파일링 시각화 도구입니다.설치와 사용이 매우 용이합니다.통상 사용하는 방법은 stat 파일을 생성하는 것입니다.%prun스네이크 비즈
사용되는 주요 viz 기법은 다음과 같은 Sunburst 차트입니다.이 그래프에서는 함수 호출의 계층이 각폭으로 부호화된 호 및 시간 정보의 레이어로 배열됩니다.
가장 좋은 점은 차트를 조작할 수 있다는 것입니다.예를 들어, 확대하려면 호를 클릭하면 호와 그 하위 호가 새로운 해돋이로 확대되어 더 자세한 내용을 표시할 수 있습니다.
cProfile 는 프로파일링에 매우 적합하며 결과를 시각화하는데 매우 적합합니다.파일 변환은 중간에서 처리합니다.
python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree
필요한 시스템 패키지:
kcachegrind(Linux),qcachegrindMacOS)
Ubuntu에서의 셋업:
apt-get install kcachegrind
pip install pyprof2calltree
그 결과:
저는 최근에 Python 런타임과 Import 프로파일을 시각화하기 위해 tunch를 만들었습니다.여기서 도움이 될 것 같아요
인스톨
pip install tuna
런타임 프로파일 생성
python3 -m cProfile -o program.prof yourfile.py
또는 Import 프로파일(Python 3.7 이상 필요)
python3 -X importprofile yourfile.py 2> import.log
그럼 파일에 참치나 넣어
tuna program.prof
또한 GUI cProfile 덤프뷰어 RunSnakeRun도 언급할 필요가 있습니다.이를 통해 프로그램의 관련 부분을 확대하여 정렬 및 선택할 수 있습니다.사진의 직사각형 크기는 촬영 시간에 비례합니다.직사각형 위에 마우스를 놓으면 해당 호출이 테이블 및 지도의 모든 위치에 강조 표시됩니다.직사각형을 더블 클릭하면 해당 부분이 확대됩니다.누가 그 부분을 호출하고 그 부분이 호출하는지 보여줍니다.
그 설명적인 정보는 매우 도움이 됩니다.내장 라이브러리 호출을 처리할 때 도움이 되는 해당 비트의 코드가 표시됩니다.어떤 파일과 어떤 행이 코드를 찾아야 하는지 알려줍니다.
또한 작전본부가 '프로파일링'이라고 말했지만 그는 '타이밍'을 의미한 것으로 보인다.프로파일링 시 프로그램 실행 속도가 느려집니다.

프로파일
line_profiler(여기서 제시된 설명)도 영감을 주었습니다.이것은 다음과 같습니다.
선 입자성, 스레드 인식 결정론 및 통계 순수 피톤 프로파일러
인 it it it it 、 it it 、 -ular 、 。line_profilerPython으로 할 수 .또, 「Python」으로할 수 도 생성할 수 있습니다[k|q]cachegrind.
비디오
다음과 같은 Python 패키지인 vprof도 있습니다.
[...] 실행 시간 및 메모리 사용량 등 다양한 Python 프로그램 특성에 대한 풍부하고 대화형 시각화를 제공합니다.
적절한 프로파일링 모듈은 line_profiler(kernprof.py 스크립트를 사용하여 호출)입니다.여기에서 다운로드 할 수 있습니다.
cProfile은 각 함수에서 소요된 총 시간에 대한 정보만 제공하는 것으로 알고 있습니다.따라서 개별 코드 행은 시간이 설정되지 않습니다.한 줄에 많은 시간이 걸리기 때문에 이것은 과학 컴퓨팅의 문제입니다.또한 cProfile은 제가 numpy.dot으로 보내는 시간을 파악하지 못했습니다.
터미널 전용(단순한) 솔루션으로, 이러한 고급 UI가 모두 설치 또는 실행되지 않는 경우:cProfile pyinstrument실행 직후에 콜트리를 수집해 표시합니다.
인스톨:
$ pip install pyinstrument
프로파일 및 표시 결과:
$ python -m pyinstrument ./prog.py
python2 및 3에서 동작합니다.
[편집] 코드의 일부만을 프로파일링하기 위한 API 매뉴얼은 이쪽에서 확인할 수 있습니다.
훌륭한 답변이 많지만, 커맨드 라인 또는 외부 프로그램을 사용하여 프로파일링 및/또는 결과를 정렬합니다.
명령줄이나 설치 없이 IDE(eclipse-PyDev)에서 사용할 수 있는 방법을 놓쳤습니다.자, 여기 있습니다.
명령줄 없이 프로파일링
def count():
from math import sqrt
for x in range(10**5):
sqrt(x)
if __name__ == '__main__':
import cProfile, pstats
cProfile.run("count()", "{}.profile".format(__file__))
s = pstats.Stats("{}.profile".format(__file__))
s.strip_dirs()
s.sort_stats("time").print_stats(10)
자세한 내용은 문서 또는 기타 답변을 참조하십시오.
멀티 스레드 코드에 대한 Joe Shaw의 답변에 따라 예상대로 동작하지 않는 것은runcall cProfile을 실행하고 입니다.self.enable() ★★★★★★★★★★★★★★★★★」self.disable()프로파일된 함수 호출을 호출하기 때문에 사용자가 직접 호출할 수 있으며 기존 코드에 대한 간섭을 최소화하면서 원하는 코드를 사용할 수 있습니다.
Austin과 같은 통계 프로파일러를 사용하면 계측이 필요하지 않으므로 Python 어플리케이션에서 프로파일링 데이터를 얻을 수 있습니다.
austin python3 my_script.py
원시 출력은 그다지 유용하지 않지만 flamegraph.pl에 파이프로 연결하여 해당 데이터의 불꽃 그래프를 얻을 수 있습니다. 이 그래프는 시간(실시간 마이크로초 단위)이 어디에 사용되는지를 보여줍니다.
austin python3 my_script.py | flamegraph.pl > my_script_profile.svg
또는 웹 애플리케이션 Speedscope.app을 사용하여 수집된 샘플을 빠르게 시각화할 수도 있습니다.pprof 가 인스톨 되어 있는 경우는, ostin-python 도 취득할 수 있습니다(예:pipx install austin-python를 사용해서 사용하세요.austin2pprof포맷.ppprof로 합니다.
그러나 VS 코드가 설치되어 있는 경우 소스 코드 히트 맵, 상위 기능 및 수집된 콜 스택을 사용하여 보다 인터랙티브한 경험을 얻을 수 있습니다.

Virtaal의 정보원에는 프로파일링을 매우 쉽게 할 수 있는 매우 유용한 클래스 및 데코레이터가 있습니다(특정 메서드/기능에도 해당).그러면 KCache Grind에서 출력을 매우 편안하게 볼 수 있습니다.
IPython 노트북의 빠른 프로파일 통계를 가져옵니다.line_profiler와 memory_profiler를 노트북에 직접 삽입할 수 있습니다.
또 다른 유용한 패키지는 Pympler입니다.클래스, 오브젝트, 함수, 메모리 누수 등을 추적할 수 있는 강력한 프로파일링 패키지입니다.다음 예시는 첨부 문서입니다.
잡아!
!pip install line_profiler
!pip install memory_profiler
!pip install pympler
장전해!
%load_ext line_profiler
%load_ext memory_profiler
써!
%시간
%time print('Outputs CPU time,Wall Clock time')
#CPU times: user 2 µs, sys: 0 ns, total: 2 µs Wall time: 5.96 µs
제공 내용:
- CPU 시간: CPU 수준 실행 시간
- sys times: 시스템레벨 실행시간
- 합계: CPU 시간 + 시스템 시간
- 벽면 시간:벽시계 시간
시간 %
%timeit -r 7 -n 1000 print('Outputs execution time of the snippet')
#1000 loops, best of 7: 7.46 ns per loop
- 루프(n) 회에서 주어진 런 수(r) 중 가장 좋은 시간을 제공합니다.
- 시스템 캐시에 대한 자세한 내용을 출력합니다.
- 코드 스니펫이 여러 번 실행되는 경우 시스템은 몇 가지 작업을 캐시하고 프로파일리포트의 정확성을 저해할 수 있는 동작을 다시 실행하지 않습니다.
%parames(%pause)
%prun -s cumulative 'Code to profile'
제공 내용:
- 함수 호출 수(ncall)
- 는 함수 콜별 엔트리를 가지고 있습니다(예:
- 콜당 소요시간(콜당)
- 해당 함수 호출까지 경과된 시간(cumtime)
- ...라는 펑크/캐릭터 이름 등
%memit
%memit 'Code to profile'
#peak memory: 199.45 MiB, increment: 0.00 MiB
제공 내용:
- 메모리 사용량
%lprun
#Example function
def fun():
for i in range(10):
print(i)
#Usage: %lprun <name_of_the_function> function
%lprun -f fun fun()
제공 내용:
- 회선 상태 통계
sys.getsizeof
sys.getsizeof('code to profile')
# 64 bytes
개체의 크기(바이트)를 반환합니다.
pympler의 asizeof()
from pympler import asizeof
obj = [1,2,("hey","ha"),3]
print(asizeof.asizeof(obj,stats=4))
pympler.asizeof를 사용하여 특정 Python 객체의 메모리 사용량을 조사할 수 있습니다.sys.getsizeof와 달리 asizeof는 오브젝트의 크기를 재귀적으로 조정합니다.
핌플러의 트래커
from pympler import tracker
tr = tracker.SummaryTracker()
def fun():
li = [1,2,3]
di = {"ha":"haha","duh":"Umm"}
fun()
tr.print_diff()
함수의 라이프 타임을 추적합니다.
Pympler 패키지는 코드를 프로파일하기 위한 수많은 고유틸리티 함수로 구성되어 있습니다.이 모든 것을 여기서 다룰 수는 없습니다.상세한 프로파일의 실장에 대해서는, 첨부의 메뉴얼을 참조해 주세요.
Pympler 문서
누적 프로파일러를 작성할 경우, 즉 함수를 연속해서 여러 번 실행하여 결과의 합계를 확인합니다.
을 .cumulative_profiler★★★★★★★★★★★★★★★★★★:
python > 하지만 python > = 3.6은 제거할 수 .nonlocal이치노
import cProfile, pstats
class _ProfileFunc:
def __init__(self, func, sort_stats_by):
self.func = func
self.profile_runs = []
self.sort_stats_by = sort_stats_by
def __call__(self, *args, **kwargs):
pr = cProfile.Profile()
pr.enable() # this is the profiling section
retval = self.func(*args, **kwargs)
pr.disable()
self.profile_runs.append(pr)
ps = pstats.Stats(*self.profile_runs).sort_stats(self.sort_stats_by)
return retval, ps
def cumulative_profiler(amount_of_times, sort_stats_by='time'):
def real_decorator(function):
def wrapper(*args, **kwargs):
nonlocal function, amount_of_times, sort_stats_by # for python 2.x remove this row
profiled_func = _ProfileFunc(function, sort_stats_by)
for i in range(amount_of_times):
retval, ps = profiled_func(*args, **kwargs)
ps.print_stats()
return retval # returns the results of the function
return wrapper
if callable(amount_of_times): # incase you don't want to specify the amount of times
func = amount_of_times # amount_of_times is the function in here
amount_of_times = 5 # the default amount
return real_decorator(func)
return real_decorator
예
baz
import time
@cumulative_profiler
def baz():
time.sleep(1)
time.sleep(2)
return 1
baz()
baz인쇄해놨어요, 5번 실행하다.
20 function calls in 15.003 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
10 15.003 1.500 15.003 1.500 {built-in method time.sleep}
5 0.000 0.000 15.003 3.001 <ipython-input-9-c89afe010372>:3(baz)
5 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
횟수 지정
@cumulative_profiler(3)
def baz():
...
.PyCharm의 를 쉽게 할 수 .line_profilerPy Charm py py py py py py py py py
line_profiler는 다른 답변에서도 언급되어 있으며 특정 행에서 python interpreter가 얼마나 많은 시간을 소비하는지 정확하게 분석할 수 있는 훌륭한 도구입니다.
작성한 PyCharm 플러그인은 https://plugins.jetbrains.com/plugin/16536-line-profiler 에서 찾을 수 있습니다.
에서 Python이라고 하는 합니다.line-profiler-pycharm할 수 .
PyCharm에 플러그인을 설치한 후:
- 은 모두 '프로파일링'으로합니다.
line_profiler_pycharm.profile - '프로파일 라인' 주자를 사용하여 실행
결과의 스크린샷:
cProfile은 빠른 프로파일링에 적합하지만 대부분의 경우 오류와 함께 종료되었습니다.함수 runctx는 환경과 변수를 올바르게 초기화함으로써 이 문제를 해결합니다.다른 사람에게 도움이 되길 바랍니다.
import cProfile
cProfile.runctx('foo()', None, locals())
gprof2dot_module
★★★★의 마법 함수:gprof2dotPython의 JupyterLab의 Jupyter노트북의 DOT.
Git Hub repo : https://github.com/mattijn/gprof2dot_magic
설치
패키지 Python이하십시오.gprof2dot_magic.
pip install gprof2dot_magic
gprof2dot ★★★★★★★★★★★★★★★★★」graphviz
사용.
기능을 , 「」를 합니다.gprof2dot_magic 표시
%load_ext gprof2dot_magic
다음으로 임의의 선문을 DOT 그래프로 프로파일합니다.
%gprof2dot print('hello world')
제 방법은 yappi(https://github.com/sumerc/yappi)를 사용하는 것입니다.특히 다음과 같은 방법으로 프로파일링 정보를 시작, 중지 및 인쇄하는 방법을 등록하는 RPC 서버와 결합하면 유용합니다.
@staticmethod
def startProfiler():
yappi.start()
@staticmethod
def stopProfiler():
yappi.stop()
@staticmethod
def printProfiler():
stats = yappi.get_stats(yappi.SORTTYPE_TTOT, yappi.SORTORDER_DESC, 20)
statPrint = '\n'
namesArr = [len(str(stat[0])) for stat in stats.func_stats]
log.debug("namesArr %s", str(namesArr))
maxNameLen = max(namesArr)
log.debug("maxNameLen: %s", maxNameLen)
for stat in stats.func_stats:
nameAppendSpaces = [' ' for i in range(maxNameLen - len(stat[0]))]
log.debug('nameAppendSpaces: %s', nameAppendSpaces)
blankSpace = ''
for space in nameAppendSpaces:
blankSpace += space
log.debug("adding spaces: %s", len(nameAppendSpaces))
statPrint = statPrint + str(stat[0]) + blankSpace + " " + str(stat[1]).ljust(8) + "\t" + str(
round(stat[2], 2)).ljust(8 - len(str(stat[2]))) + "\t" + str(round(stat[3], 2)) + "\n"
log.log(1000, "\nname" + ''.ljust(maxNameLen - 4) + " ncall \tttot \ttsub")
log.log(1000, statPrint)
할 수 를 기동하려면 , 「프로파일러」를 해 주세요.startProfiler 및 합니다.printProfiler한다)와 출력을 가져옵니다(「rpc method」).이 출력은 다음과 같습니다.
2014-02-19 16:32:24,128-|SVR-MAIN |-(Thread-3 )-Level 1000:
name ncall ttot tsub
2014-02-19 16:32:24,128-|SVR-MAIN |-(Thread-3 )-Level 1000:
C:\Python27\lib\sched.py.run:80 22 0.11 0.05
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\xmlRpc.py.iterFnc:293 22 0.11 0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\serverMain.py.makeIteration:515 22 0.11 0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\PicklingXMLRPC.py._dispatch:66 1 0.0 0.0
C:\Python27\lib\BaseHTTPServer.py.date_time_string:464 1 0.0 0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py._get_raw_meminfo:243 4 0.0 0.0
C:\Python27\lib\SimpleXMLRPCServer.py.decode_request_content:537 1 0.0 0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py.get_system_cpu_times:148 4 0.0 0.0
<string>.__new__:8 220 0.0 0.0
C:\Python27\lib\socket.py.close:276 4 0.0 0.0
C:\Python27\lib\threading.py.__init__:558 1 0.0 0.0
<string>.__new__:8 4 0.0 0.0
C:\Python27\lib\threading.py.notify:372 1 0.0 0.0
C:\Python27\lib\rfc822.py.getheader:285 4 0.0 0.0
C:\Python27\lib\BaseHTTPServer.py.handle_one_request:301 1 0.0 0.0
C:\Python27\lib\xmlrpclib.py.end:816 3 0.0 0.0
C:\Python27\lib\SimpleXMLRPCServer.py.do_POST:467 1 0.0 0.0
C:\Python27\lib\SimpleXMLRPCServer.py.is_rpc_path_valid:460 1 0.0 0.0
C:\Python27\lib\SocketServer.py.close_request:475 1 0.0 0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\__init__.py.cpu_times:1066 4 0.0 0.0
하지 않을 수 , 데.printProfiler예를 들어 다양한 프로그램 사용 시나리오에 대한 프로파일링 및 비교를 위해 시간이 지남에 따라 여러 번 메서드를 호출할 수 있습니다.
최신 버전의 yappi에서는 다음 코드가 작동합니다.
@staticmethod
def printProfile():
yappi.get_func_stats().print_all()
https://stackoverflow.com/a/582337/1070617,에 추가하려면
cProfile을 사용하여 출력을 쉽게 볼 수 있도록 이 모듈을 작성했습니다.자세한 사항은 이쪽:https://github.com/ymichael/cprofilev
$ python -m cprofilev /your/python/program
# Go to http://localhost:4000 to view collected statistics.
수집된 통계정보를 이해하는 방법에 대해서는http://http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html 를 참조해 주세요.
PyVmMonitor는 PyVmMonitor에서 프로파일링을 처리하는 새로운 툴입니다.http://www.pyvmmonitor.com/
다음과 같은 독특한 기능이 있습니다.
- 실행 중인(CPython) 프로그램에 프로파일러 연결
- Yappi 통합을 통한 온 디맨드 프로파일링
- 다른 시스템의 프로파일
- 다중 프로세스 지원(멀티 프로세싱, django...)
- 라이브 샘플링/CPU 뷰(시간 범위 선택 포함)
- cProfile/profile 통합을 통한 결정론적 프로파일링
- 기존 PSats 결과 분석
- DOT 파일 열기
- 프로그래밍형 API 액세스
- 방법 또는 선별로 샘플 그룹화
- PyDev 통합
- PyCharm 통합
주의: 상업용이지만 오픈 소스에는 무료입니다.
프로파일링에서 뭘 보느냐에 따라 다르겠죠간단한 시간 메트릭은 (배시)를 통해 제공할 수 있습니다.
time python python_prog.py
'/usr/bin/time'도 '--verbose' 플래그를 사용하여 세부 메트릭을 출력할 수 있습니다.
각 함수에 의해 주어진 시간 메트릭을 확인하고 함수에 소비되는 시간을 더 잘 이해하기 위해 python에서 내장된 cProfile을 사용할 수 있습니다.
퍼포먼스와 같은 보다 상세한 메트릭으로 넘어가면 시간만이 메트릭이 아닙니다.메모리나 스레드 등에 대해 걱정할 수 있습니다.
다음 중 하나:
1. line_profiler는 타이밍 메트릭을 한 줄 한 줄 알아내기 위해 일반적으로 사용되는 다른 프로파일러입니다.
2. memory_profiler는 메모리 사용량을 프로파일링하는 도구입니다.
3. Heapy (프로젝트 Guppy에서) 힙 내의 객체가 어떻게 사용되는지 프로파일링합니다.
이것들은 제가 자주 사용하는 것들 중 일부입니다.하지만 만약 여러분이 더 알고 싶다면, 이 책을 읽어보세요. 이 책은 성과를 염두에 두고 시작하는 것에 대한 꽤 좋은 책입니다.Cython 및 JIT(Just-in-time) 컴파일된 python 사용에 대한 고급 토픽으로 이동할 수 있습니다.
pypref_time에서 영감을 얻어 나만의 프로파일러를 개발했습니다.
https://github.com/modaresimr/auto_profiler
데코레이터를 추가하면 시간이 걸리는 기능의 트리가 표시됩니다.
@Profiler(depth=4, on_disable=show)
Install by: pip install auto_profiler
예
import time # line number 1
import random
from auto_profiler import Profiler, Tree
def f1():
mysleep(.6+random.random())
def mysleep(t):
time.sleep(t)
def fact(i):
f1()
if(i==1):
return 1
return i*fact(i-1)
def show(p):
print('Time [Hits * PerHit] Function name [Called from] [Function Location]\n'+\
'-----------------------------------------------------------------------')
print(Tree(p.root, threshold=0.5))
@Profiler(depth=4, on_disable=show)
def main():
for i in range(5):
f1()
fact(3)
if __name__ == '__main__':
main()
출력 예
Time [Hits * PerHit] Function name [Called from] [function location]
-----------------------------------------------------------------------
8.974s [1 * 8.974] main [auto-profiler/profiler.py:267] [/test/t2.py:30]
├── 5.954s [5 * 1.191] f1 [/test/t2.py:34] [/test/t2.py:14]
│ └── 5.954s [5 * 1.191] mysleep [/test/t2.py:15] [/test/t2.py:17]
│ └── 5.954s [5 * 1.191] <time.sleep>
|
|
| # The rest is for the example recursive function call fact
└── 3.020s [1 * 3.020] fact [/test/t2.py:36] [/test/t2.py:20]
├── 0.849s [1 * 0.849] f1 [/test/t2.py:21] [/test/t2.py:14]
│ └── 0.849s [1 * 0.849] mysleep [/test/t2.py:15] [/test/t2.py:17]
│ └── 0.849s [1 * 0.849] <time.sleep>
└── 2.171s [1 * 2.171] fact [/test/t2.py:24] [/test/t2.py:20]
├── 1.552s [1 * 1.552] f1 [/test/t2.py:21] [/test/t2.py:14]
│ └── 1.552s [1 * 1.552] mysleep [/test/t2.py:15] [/test/t2.py:17]
└── 0.619s [1 * 0.619] fact [/test/t2.py:24] [/test/t2.py:20]
└── 0.619s [1 * 0.619] f1 [/test/t2.py:21] [/test/t2.py:14]
그 비단뱀 스크립트가 대체 뭘 하는지 알고 싶어?Inspect Shell 을 입력합니다.Inspect Shell을 사용하면 실행 중인 스크립트를 중단하지 않고 글로벌 인쇄/변경 및 함수 실행을 수행할 수 있습니다.자동 완성 및 명령어 이력(Linux에서만 가능)이 표시됩니다.
검사 셸은 pdb 형식의 디버거가 아닙니다.
https://github.com/amoffat/Inspect-Shell
그거(그리고 손목시계)를 사용하셔도 됩니다.
라고 하는 통계 프로파일러도 있습니다.샘플링 프로파일러이므로 코드에 최소한의 오버헤드가 추가되어 (함수 베이스뿐만 아니라) 회선 베이스의 타이밍이 제공됩니다.게임 등 소프트한 실시간 어플리케이션에 적합하지만 cProfile보다 정밀도가 낮을 수 있습니다.
pypi의 버전이 조금 오래된 버전이기 때문에 설치는 가능합니다.pipgit 저장소를 지정하면 다음과 같이 됩니다.
pip install git+git://github.com/bos/statprof.py@1a33eba91899afe17a8b752c6dfdec6f05dd0c01
다음과 같이 실행할 수 있습니다.
import statprof
with statprof.profile():
my_questionable_function()
https://stackoverflow.com/a/10333592/320036 도 참조해 주세요.
cprofiler 및 기타 리소스는 디버깅이 아니라 최적화를 위한 것임을 알게 되었습니다.
간단한 python 스크립트 속도 테스트를 위해 대신 테스트 모듈을 만들었습니다(내 경우 ScriptProfilerPy를 사용하여 1K+ lines py 파일을 테스트하고 몇 분 후에 코드 속도를 10배 향상시킵니다).
Script Profiler Py() 모듈은 코드를 실행하여 타임스탬프를 추가합니다.이 모듈에는 https://github.com/Lucas-BLP/ScriptProfilerPy을 참조해 주세요.
용도:
from speed_testpy import ScriptProfilerPy
ScriptProfilerPy("path_to_your_script_to_test.py").Profiler()
출력:
언급URL : https://stackoverflow.com/questions/582336/how-do-i-profile-a-python-script
'source' 카테고리의 다른 글
| Python: 예외를 무시하고 계속 진행하려면 어떻게 해야 합니까? (0) | 2023.01.15 |
|---|---|
| convert_tz가 null을 반환합니다. (0) | 2023.01.15 |
| jQuery를 사용하여 체크박스에 대해 "체크" 설정 (0) | 2023.01.15 |
| Mysql은 sudo와 함께 작동하지만 그렇지 않습니다.(ubuntu 16.04, mysql 5.7.12-0ubuntu1).1) (0) | 2023.01.15 |
| 이벤트 루프 컨텍스트 내의 마이크로태스크와 매크로태스크의 차이 (0) | 2023.01.15 |










