프로젝트 오일러와 다른 코딩 대회에서는 종종 최대 실행 시간이 정해져 있거나 사람들이 자신의 특정 솔루션이 얼마나 빨리 실행되는지 자랑하기도 합니다. 파이썬에서는 __main__
에 타이밍 코드를 추가하는 등 다소 주먹구구식으로 접근하는 경우도 있습니다.
파이썬 프로그램이 실행되는 데 걸리는 시간을 프로파일링하는 좋은 방법은 무엇일까요?
파이썬에는 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}
편집: 파이콘 2013의 좋은 비디오 리소스에 대한 링크가 업데이트되었습니다. 파이썬 프로파일링 [유튜브를 통해서도](
얼마 전 내가 내가 '피콜그래프' 에서 파이썬 코드를 생성할 심상. Edit: I& # 39, ve 업데이트되도록 사용할 수 있는 최신 릴리스에는 3.3tb, 예를 들면 말 쓰기 시작했다.
그래프비츠 '와' 설치 등을 설치 후 피콜그래프 명령줄이 에서 실행할 수 있습니다.
pycallgraph graphviz -- ./mypythonscript.py
또는 특정 부분을 코드에 프로파일링할 수 있습니다.
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
아래 이미지는 '둘 중 하나를 피콜그래프리프니크 비슷한' 파일이 생성됩니다.
프로파일러를 사용하면 (기본적으로) 메인 스레드에서만 작동하며 다른 스레드에서 정보를 얻을 수 없다는 점을 지적할 가치가 있습니다. 이는 프로파일러 문서에 전혀 언급되어 있지 않기 때문에 약간 혼란스러울 수 있습니다.
스레드를 프로파일링하려면 문서에서 threading.setprofile()
함수를 살펴보세요.
스레드 프로파일링을 위한 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
클래스를 사용할 수 있습니다. 더 많은 유연성을 제공할 수 있지만, 특히 클래스를 사용하지 않는 타사 코드를 사용하는 경우 그만한 가치가 있는지 확실하지 않습니다.
Wiki 는 파이썬 숭배자들로부터도 페이지 프로파일링의 경우 자료: http://wiki.python.org/moin/PythonSpeed/PerformanceTips # Profiling_Code
있는 그대로 파이썬 문서: http://docs.python.org/library/profile.html
손쉽게 사용할 수 있는 것은 큰 도구에서는 로울러 크리스씨가 에서 볼 수 있는 것처럼 크프로피레 인쇄하려면 화면:
python -m cProfile -s time mine.py <args>
또는 파일:
python -m cProfile -o output.file mine.py <args>
PS>. Unbuntu 사용하는 경우, 파이썬 프로파일할 설치해야 합니다
sudo apt-get install python-profiler
파일로 출력 경우 다음과 같은 도구를 사용하여 가상화 잘 볼 수 있습니다.
피콜그래프: 호출 그래프 이미지를 만들 수 있는 툴이 < br>; install:< br>;
sudo pip install pycallgraph
실행하십시오:
pycallgraph mine.py args
보기:
gimp pycallgraph.png
, Png 파일을 사용할 수 있습니다, whatever you like I 함께사용할 gimp*&l br> 볼 수 있습니다. 저는 가끔 죄송합니다. 확보하십시오.
점: 너무 커서 카이로 렌더러입니다. 그래프화합니다 비트맵입니다. 맞게 0.257079 통해 확장을
내 이미지 우누사블리 수 있는 작은. 그래서 일반적으로 svg 파일을 만듭니다.
pycallgraph -f svg -o pycallgraph.svg mine.py <args>
PS>. 그래프비츠 (joyon. 제공하는 프로그램) 를 설치해야 합니다.
sudo pip install graphviz
그래프) 를 사용하여 다른 gprof2dot @maxy / @quodlibetor:
sudo pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg
$ 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
및 연기하는거야!
출력은 joyon. 사용한다 (동일한 심아이엔큐 피콜그래프 /dev/raw/raw1 등과 비슷하다. 뭐 좀 더 적은 정보를 유실됩니다 인상을 gprof2dot 표시되어도:
이 때 나는 스나케비츠 에 실행했음 핸디 도구에서는 불렀으매 연구 주제. 스나케비츠 는 웹 기반 프로필링 시각화 도구. 설치 및 사용에 매우 쉽습니다. 내가 사용하는 방법을 사용하여 파일을 생성할 수 있는 것은 일반적인 통계 분석 '와' %prun 재동기화할 스나케비츠.
, 는 기본 비즈 사용되는 기술은 아래와 같이 햇살 차트입니다 있는 함수 호출 계층 레이어로 호 및 시간 정보를 각 폭 그들의 인코딩되지 배치되어 있습니다.
가장 좋은 것은 차트입니다 상호 작용할 수 있습니다. 예를 들어, 1 호 (arc), 호 및 하위 항목 클릭하면 확대 될 수 있는 새로운 햇살 표시하십시오 확대 등 자세한 내용.
'크프로피레' 내가 생각하는 반면, '나카시그리드' 프로파일링의 경우 가장 큰 배를 결과는 매우 유용합니다. 3 의 ['pyprof2calltree'] 그 사이에 는 파일 변환.
python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree
설치하는 데 필요한 도구 (켜짐이 unbuntu, 최소한):
apt-get install kcachegrind
pip install pyprof2calltree
결과:
또한 GUI 는 규모의 거론하며 크프로피레 덤프하지 뷰어입니다 런스나이크런. 이 때문에 정렬하려면 있습니다 선택하고 확대 관련 부분을 프로그램였어 그림에서 사각형 시간에 크기에 비례한다. 마우스를 사각형에는 호출하는 경우 강조표시됩니다 테이블에서 모든 지도상에. 이 두 번 클릭하면 해당 부분을 사각형에는 확대합니다. 또 누가, 어떤 페이징됩니다 해당 부분을 보여줄 수 있는 부분이 있다.
상세 정보는 매우 도움이 된다. 그 때 유용하게 사용될 수 있는 비트 코드를 보여 줍니다 겪고 있는 내장현 라이브러리란 있다. 그 어떤 파일 및 코드 찾기 위해 어떤 선 알려줍니다.
1. pip install snakeviz
2. python -m cProfile -o temp.dat <PROGRAM>.py
3. snakeviz temp.dat
브라우저에서 파이라고요 차트입니다 그립니다. 블렌드합니다 문제가 가장 큰 특징이다. 아주 간단합니다.
좋은 프로필링 module 은 line_profiler (일명 name. domain. 스크립트입니다 kernprof.py). Here 다운로드할 수 있습니다.
총 소요 시간 내 각 함수에 대한 정보를 얻을 수 있는 전용 크프로피레 알고 있다. 따라서 개별 코드 행 시간이 없습니다. 이 문제는 시간이 많이 걸릴 수 있기 때문에 과학 컴퓨팅용으로 하나의 선 경우가 많습니다. 또한, as I catch the time I was 지출의 너희에게베풀어진 크프로피레 didn& # 39 라고 누마피오도토스, t
'line_profiler 한다' (이미 여기에 제시된) 도 ['프로피레'] (https://github.com/vpelletier/pprofile) 를 것으로 묘사되고 있다.
>. 결정론적 및 통계 순수 파이썬 알고 스레드할 선 세분성, >. 프로필러
또한, 파이썬, 순수한 '로 선 세분성 line_profiler' 로 사용될 수 있으며, 심지어 독립 명령이나 모듈에서는 칼그리드 형식 발령합니다 쉽게 분석할 수 있는 파일 '을 (를)' [k q] 카시그리드.
또한 [우프로프] (https://github.com/nvdv/vprof) 는 파이썬 패키지 묘사된다.
>. [.] 파이썬 프로그램에 제공하는 각종 가상화 및 대화형 부유하도다 등의 특징을 실행 시간 및 메모리 사용.
난 최근에 만들어진 [참치] (https://github.com/nschloe/tuna) 를 파이썬 런타임용으로 개발하십시오 시각화 및 가져오기할 프로파일입니다. 여기 이 도움이 될 수 있습니다.
설치 "' 참치, pip3 설치 "' 런타임용으로 개발하십시오 프로파일할 만듭니다. "' 파이썬 프로그램지프로프 맥프로피레 - o - yourfile.py "' 호스트였든 가져오기의 프로파일 (파이썬 3.7+ 필수) "' 파이썬 - X 임포트프로피레 2>, yourfile.py 임포트드로그 "' 그럼 도망쳐야해 참치 파일에 대한 "' 참치 프로그램지프로프 "'
내가 정말 누락했습니다 닿지 않고 다른 방법으로 사용할 수 있는 내 IDE (eclipse 피데프) 이 명령줄이나 설치할 수 없다. 그래서 여기 있네요.
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)
참조 docs 또는 다른 대한 자세한 정보.
My way 를 사용하는 것이 이아피 (https://code.google.com/p/yappi/). 특히 유용한 결합됨 it& # 39 에 등록할 수 있는 방법을 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)
작업할 때 보라그들은 프로필러 시작 프로그램에 언제든지 스타르프로피러 호출하여 '수' RPC 호출을 통해 프린스프로피러 방법 및 로그 파일에 대한 정보를 덤프합니다 프로필링 '수' (또는 수정하십시오 rpc 방법을 반품해야 요청자에게) 와 같은 출력:
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
특히 수 있지만 그렇지 않을 수 있는 점을 고려할 때 매우 유용합니다 파선-짧은 스크립트에만 서버 유형 최적화합니다 프로세스활용 프린스프로피러 '' 메서드를 호출할 수 시간 경과에 따라 여러 번 프로파일이고 비교하십시오 다양한 프로그램 사용 시나리오를. (예:
누적 프로필러 만들려면, 그 의미는 실행하십시오 여러 차례 연속 함수 및 제스쳐놀이처럼 합한 결과를 얻을 수 있습니다.
데코레이터 cumulative_profiler '이' 사용할 수 있습니다.
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
'함수' 배즈 프로필링
import time
@cumulative_profiler
def baz():
time.sleep(1)
time.sleep(2)
return 1
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():
...
(Https://stackoverflow.com/a/582337/1070617) 를 추가하고,
내가 이 모듈에서는 작성했습니까 쉽게 볼 수 있는 크프로피레 및 출력입니다 사용할 수 있습니다. 더 있습니다. https://github.com/ymichael/cprofilev
$ python -m cprofilev /your/python/program
# Go to http://localhost:4000 to view collected statistics.
참조: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html 수집됩니다 쉽게 이해할 수 있는 방법에 대한 통계.
Python 은 프로필링 처리할 수 있는 새로운 도구를 피프먼이터: http://www.pyvmmonitor.com/
이 같은 고유한 기능을 보유하고 있다
참고: # 39 의 상업적 있지만, it& 위한 무료 오픈 소스.