프로젝트 오일러 및 기타 코딩 공모전은 종종 최대 실행 시간을 갖거나 사람들이 특정 솔루션의 실행 속도를 자랑합니다. 파이썬의 경우 때때로 접근 방식이 다소 복잡합니다 __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}
편집 : PyCon 2013에서 Python Profiling
Also YouTube를 통해 좋은 비디오 리소스에 대한 링크가 업데이트
되었습니다 .
답변
얼마 전에 pycallgraph
파이썬 코드에서 시각화를 생성했습니다. 편집 : 이 글을 쓰는 시점에서 최신 릴리스 3.3으로 작동하도록 예제를 업데이트했습니다.
GraphViz 를 pip install pycallgraph
설치 한 후 명령 행에서 실행할 수 있습니다.
pycallgraph graphviz -- ./mypythonscript.py
또는 코드의 특정 부분을 프로파일 링 할 수 있습니다.
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
이들 중 하나가 pycallgraph.png
아래 이미지와 유사한 파일 을 생성 합니다.
답변
프로파일 러를 사용하면 기본 스레드에서만 작동하며 기본 스레드를 사용하는 경우 다른 스레드에서 정보를 얻지 못합니다. 이것은 프로파일 러 문서 에서 완전히 언급되지 않았기 때문에 약간의 문제가 될 수 있습니다 .
스레드를 프로파일 링하려면 함수 를 살펴보고 싶을 것입니다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
표준 클래스 대신 해당 클래스를 사용하십시오. 그것은 당신에게 더 많은 유연성을 줄 수 있지만, 특히 클래스를 사용하지 않는 타사 코드를 사용하는 경우 가치가 있는지 확실하지 않습니다.
답변
Python Wiki는 리소스 프로파일 링을위한 훌륭한 페이지입니다.
http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
파이썬 문서와 마찬가지로 :
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 : 콜 그래프 이미지를 생성하는 도구
설치 :
pip install pycallgraph
운영:
pycallgraph mine.py args
전망:
gimp pycallgraph.png
당신은 당신이 PNG 파일을보고 싶은대로 사용할 수 있습니다, 나는 김프를 사용
불행하게도 나는 종종 얻는다.
점 : Cairo- 렌더러 비트 맵에 그래프가 너무 큽니다. 적합하도록 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
그리고 BLAM!
도트 (pycallgraph와 동일한 것)를 사용하므로 출력이 비슷해 보입니다. gprof2dot가 정보를 덜 잃는다는 인상을 얻습니다.
답변
이 주제를 연구 할 때 SnakeViz 라는 편리한 도구를 사용했습니다 . SnakeViz는 웹 기반 프로파일 링 시각화 도구입니다. 설치 및 사용이 매우 쉽습니다. 내가 사용하는 일반적인 방법은 stat 파일을 생성하는 것입니다.%prun
은 SnakeViz에서 다음 분석하는 것입니다.
사용되는 주요 viz 기술은 햇살 차트입니다. 아래와 같이 로, 함수 호출의 계층 구조는 각도 폭으로 인코딩 된 호 및 시간 정보 레이어로 배열됩니다.
가장 좋은 것은 차트와 상호 작용할 수 있다는 것입니다. 예를 들어, 확대하려면 호를 클릭하면 호와 그 자손이 새로운 햇살로 확대되어 더 자세한 정보를 표시합니다.
답변
항상가는 곳을 찾는 가장 간단 하고 빠른 방법입니다.
1. pip install snakeviz
2. python -m cProfile -o temp.dat <PROGRAM>.py
3. snakeviz temp.dat
브라우저에서 원형 차트를 그립니다. 가장 큰 부분은 문제 기능입니다. 매우 간단합니다.