[python] 파이썬 스크립트를 어떻게 프로파일 링 할 수 있습니까?

프로젝트 오일러 및 기타 코딩 공모전은 종종 최대 실행 시간을 갖거나 사람들이 특정 솔루션의 실행 속도를 자랑합니다. 파이썬의 경우 때때로 접근 방식이 다소 복잡합니다 __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으로 작동하도록 예제를 업데이트했습니다.

GraphVizpip 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가 정보를 덜 잃는다는 인상을 얻습니다.

gprof2dot 예제 출력


답변

이 주제를 연구 할 때 SnakeViz 라는 편리한 도구를 사용했습니다 . SnakeViz는 웹 기반 프로파일 링 시각화 도구입니다. 설치 및 사용이 매우 쉽습니다. 내가 사용하는 일반적인 방법은 stat 파일을 생성하는 것입니다.%prun 은 SnakeViz에서 다음 분석하는 것입니다.

사용되는 주요 viz 기술은 햇살 차트입니다. 아래와 같이 로, 함수 호출의 계층 구조는 각도 폭으로 인코딩 된 호 및 시간 정보 레이어로 배열됩니다.

가장 좋은 것은 차트와 상호 작용할 수 있다는 것입니다. 예를 들어, 확대하려면 호를 클릭하면 호와 그 자손이 새로운 햇살로 확대되어 더 자세한 정보를 표시합니다.

여기에 이미지 설명을 입력하십시오


답변

항상가는 곳을 찾는 가장 간단 하고 빠른 방법입니다.

1. pip install snakeviz

2. python -m cProfile -o temp.dat <PROGRAM>.py

3. snakeviz temp.dat

브라우저에서 원형 차트를 그립니다. 가장 큰 부분은 문제 기능입니다. 매우 간단합니다.