Python 스크립트를 프로파일링하려면 어떻게 해야 하나요?

프로젝트 오일러와 다른 코딩 대회에서는 종종 최대 실행 시간이 정해져 있거나 사람들이 자신의 특정 솔루션이 얼마나 빨리 실행되는지 자랑하기도 합니다. 파이썬에서는 __main__에 타이밍 코드를 추가하는 등 다소 주먹구구식으로 접근하는 경우도 있습니다.

파이썬 프로그램이 실행되는 데 걸리는 시간을 프로파일링하는 좋은 방법은 무엇일까요?

질문에 대한 의견 (4)
해결책

파이썬에는 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 :1()
 1000    0.051    0.000    0.051    0.000 euler048.py:2()
    1    0.005    0.005    0.061    0.061 euler048.py:2()
    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의 좋은 비디오 리소스에 대한 링크가 업데이트되었습니다. 파이썬 프로파일링 [유튜브를 통해서도](https://www.youtube.com/watch?v=QJwVYlDzAXs).

해설 (13)

얼마 전 내가 내가 '피콜그래프' 에서 파이썬 코드를 생성할 심상. 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()

아래 이미지는 '둘 중 하나를 피콜그래프리프니크 비슷한' 파일이 생성됩니다.

enter 이미지 여기에 설명을!

해설 (10)

프로파일러를 사용하면 (기본적으로) 메인 스레드에서만 작동하며 다른 스레드에서 정보를 얻을 수 없다는 점을 지적할 가치가 있습니다. 이는 프로파일러 문서에 전혀 언급되어 있지 않기 때문에 약간 혼란스러울 수 있습니다.

스레드를 프로파일링하려면 문서에서 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 클래스를 사용할 수 있습니다. 더 많은 유연성을 제공할 수 있지만, 특히 클래스를 사용하지 않는 타사 코드를 사용하는 경우 그만한 가치가 있는지 확실하지 않습니다.

해설 (6)

Wiki 는 파이썬 숭배자들로부터도 페이지 프로파일링의 경우 자료: http://wiki.python.org/moin/PythonSpeed/PerformanceTips # Profiling_Code

있는 그대로 파이썬 문서: http://docs.python.org/library/profile.html

손쉽게 사용할 수 있는 것은 큰 도구에서는 로울러 크리스씨가 에서 볼 수 있는 것처럼 크프로피레 인쇄하려면 화면:

python -m cProfile -s time mine.py 

또는 파일:

python -m cProfile -o output.file mine.py 

PS&gt. Unbuntu 사용하는 경우, 파이썬 프로파일할 설치해야 합니다

sudo apt-get install python-profiler 

파일로 출력 경우 다음과 같은 도구를 사용하여 가상화 잘 볼 수 있습니다.

피콜그래프: 호출 그래프 이미지를 만들 수 있는 툴이 &lt br>; install:&lt br>;

 sudo pip install pycallgraph

실행하십시오:

 pycallgraph mine.py args

보기:

 gimp pycallgraph.png

, Png 파일을 사용할 수 있습니다, whatever you like I 함께사용할 gimp*&l br&gt 볼 수 있습니다. 저는 가끔 죄송합니다. 확보하십시오.

점: 너무 커서 카이로 렌더러입니다. 그래프화합니다 비트맵입니다. 맞게 0.257079 통해 확장을

내 이미지 우누사블리 수 있는 작은. 그래서 일반적으로 svg 파일을 만듭니다.

pycallgraph -f svg -o pycallgraph.svg mine.py 

PS&gt. 그래프비츠 (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
해설 (2)

39 에 대한 의견 @maxy& [이 오토메이티드] (https://stackoverflow.com/a/7693928/25616) 는 자체 대답을 안 할 정도로 나를 데리고 것 같아요. 난 이미 크프로피레 생성할지 오프스테스 파일과 함께 사용되는 피콜그래프 셨으며 재실행할 싶지 않다, 그래서 내가 didn& # 39, [gprof2dot] (http://code.google.com/p/jrfonseca/wiki/Gprof2Dot) 및 attaboy 예쁜 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 표시되어도:

! gprof2dot 출력은

해설 (9)

이 때 나는 스나케비츠 에 실행했음 핸디 도구에서는 불렀으매 연구 주제. 스나케비츠 는 웹 기반 프로필링 시각화 도구. 설치 및 사용에 매우 쉽습니다. 내가 사용하는 방법을 사용하여 파일을 생성할 수 있는 것은 일반적인 통계 분석 '와' %prun 재동기화할 스나케비츠.

, 는 기본 비즈 사용되는 기술은 아래와 같이 햇살 차트입니다 있는 함수 호출 계층 레이어로 호 및 시간 정보를 각 폭 그들의 인코딩되지 배치되어 있습니다.

가장 좋은 것은 차트입니다 상호 작용할 수 있습니다. 예를 들어, 1 호 (arc), 호 및 하위 항목 클릭하면 확대 될 수 있는 새로운 햇살 표시하십시오 확대 등 자세한 내용.

! [입력하십시오. 이미지 여기에 설명을] [2]

해설 (2)

'크프로피레' 내가 생각하는 반면, '나카시그리드' 프로파일링의 경우 가장 큰 배를 결과는 매우 유용합니다. 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

결과:

! [스크린샷 결과] [4]

해설 (1)

또한 GUI 는 규모의 거론하며 크프로피레 덤프하지 뷰어입니다 런스나이크런. 이 때문에 정렬하려면 있습니다 선택하고 확대 관련 부분을 프로그램였어 그림에서 사각형 시간에 크기에 비례한다. 마우스를 사각형에는 호출하는 경우 강조표시됩니다 테이블에서 모든 지도상에. 이 두 번 클릭하면 해당 부분을 사각형에는 확대합니다. 또 누가, 어떤 페이징됩니다 해당 부분을 보여줄 수 있는 부분이 있다.

상세 정보는 매우 도움이 된다. 그 때 유용하게 사용될 수 있는 비트 코드를 보여 줍니다 겪고 있는 내장현 라이브러리란 있다. 그 어떤 파일 및 코드 찾기 위해 어떤 선 알려줍니다.

39, & # 39 도 지점에 있는 스맥랜드의 OP profiling& 것 "이라고 말했다. # 39, & # 39, 그 말은 그가 timing& 보인다. 프로그램을 실행할 때 속도가 느린 프로파일링된 염두에 두어야 합니다.

enter 이미지 여기에 설명을!

해설 (0)
        • 및 가장 간단한 방법은 항상 어디에 있는지 가장 빠른 것 같습니다.
1. pip install snakeviz

2. python -m cProfile -o temp.dat .py

3. snakeviz temp.dat

브라우저에서 파이라고요 차트입니다 그립니다. 블렌드합니다 문제가 가장 큰 특징이다. 아주 간단합니다.

해설 (1)

좋은 프로필링 module 은 line_profiler (일명 name. domain. 스크립트입니다 kernprof.py). Here 다운로드할 수 있습니다.

총 소요 시간 내 각 함수에 대한 정보를 얻을 수 있는 전용 크프로피레 알고 있다. 따라서 개별 코드 행 시간이 없습니다. 이 문제는 시간이 많이 걸릴 수 있기 때문에 과학 컴퓨팅용으로 하나의 선 경우가 많습니다. 또한, as I catch the time I was 지출의 너희에게베풀어진 크프로피레 didn& # 39 라고 누마피오도토스, t

해설 (0)

프로피레

'line_profiler 한다' (이미 여기에 제시된) 도 ['프로피레'] (https://github.com/vpelletier/pprofile) 를 것으로 묘사되고 있다.

&gt. 결정론적 및 통계 순수 파이썬 알고 스레드할 선 세분성, &gt. 프로필러

또한, 파이썬, 순수한 '로 선 세분성 line_profiler' 로 사용될 수 있으며, 심지어 독립 명령이나 모듈에서는 칼그리드 형식 발령합니다 쉽게 분석할 수 있는 파일 '을 (를)' [k q] 카시그리드.

우프로프

또한 [우프로프] (https://github.com/nvdv/vprof) 는 파이썬 패키지 묘사된다.

&gt. [.] 파이썬 프로그램에 제공하는 각종 가상화 및 대화형 부유하도다 등의 특징을 실행 시간 및 메모리 사용.

! [히트 맵] [1]

해설 (0)

난 최근에 만들어진 [참치] (https://github.com/nschloe/tuna) 를 파이썬 런타임용으로 개발하십시오 시각화 및 가져오기할 프로파일입니다. 여기 이 도움이 될 수 있습니다.

! [입력하십시오. 이미지 여기에 설명을] [1]

설치 "' 참치, pip3 설치 "' 런타임용으로 개발하십시오 프로파일할 만듭니다. "' 파이썬 프로그램지프로프 맥프로피레 - o - yourfile.py "' 호스트였든 가져오기의 프로파일 (파이썬 3.7+ 필수) "' 파이썬 - X 임포트프로피레 2&gt, yourfile.py 임포트드로그 "' 그럼 도망쳐야해 참치 파일에 대한 "' 참치 프로그램지프로프 "'

해설 (0)

39 의 there& 멋지구리해요 답을 많이 있지만 일부 외부 프로그램을 사용할 명령줄이나 프로필링 및 / 또는 정렬 결과를 얻을 수 있습니다.

내가 정말 누락했습니다 닿지 않고 다른 방법으로 사용할 수 있는 내 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 또는 다른 대한 자세한 정보.

해설 (1)

39 에 대한 답변을 조라네 Shaw& 다음과 같은 코드를 사용할 수 있는 '예상대로' 루 콜 멀티스레디드 아니라 내가 생각 하는 방법으로 크프로피레 셀프리에네이블 () 은 단지 ' ()', '와' 셀프리드사이블 프로파일링된 함수 호출 할 수 있도록 주변의 페이징됩니다 단순히 교도관님도요 있고 그 사이에 어떤 코드를 운영까지도 인터퍼런스 최소화하면서 기존 코드를.

해설 (2)

Virtaal의 소스에는 프로파일링(특정 메서드/함수에 대해서도)을 매우 쉽게 할 수 있는 매우 유용한 클래스와 데코레이터가 있습니다. 그런 다음 출력은 KCacheGrind에서 매우 편안하게 볼 수 있습니다.

해설 (1)

매우 빠른 시간 내에 크프로피레 프로필링 기울이나 전송되었기 기간말 가져다줄래요 함께 오류뿐만. 룬치스 방식으로 이 문제를 해결할 수 있는 기능을 제대로 초기화중 com/go/4e6b330a_kr, 환경, 그런 것이 유용할 수 있다.

import cProfile
cProfile.runctx('foo()', None, locals())
해설 (0)

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
.__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
.__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 

특히 수 있지만 그렇지 않을 수 있는 점을 고려할 때 매우 유용합니다 파선-짧은 스크립트에만 서버 유형 최적화합니다 프로세스활용 프린스프로피러 '' 메서드를 호출할 수 시간 경과에 따라 여러 번 프로파일이고 비교하십시오 다양한 프로그램 사용 시나리오를. (예:

해설 (2)

누적 프로필러 만들려면, 그 의미는 실행하십시오 여러 차례 연속 함수 및 제스쳐놀이처럼 합한 결과를 얻을 수 있습니다.

데코레이터 cumulative_profiler '이' 사용할 수 있습니다.

39 의 파이썬 &gt it& 3.6tb 수 있지만, 이를 위한 구체적인 '=' 제거하시겠습니까 비지역 작동합니까 이전 버전에 대한.

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 :3(baz)
        5    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

횟수만큼 지정

@cumulative_profiler(3)
def baz():
    ...
해설 (0)

(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 수집됩니다 쉽게 이해할 수 있는 방법에 대한 통계.

해설 (0)

Python 은 프로필링 처리할 수 있는 새로운 도구를 피프먼이터: http://www.pyvmmonitor.com/

이 같은 고유한 기능을 보유하고 있다

  • 프로필러 부착합니다 (스피통) 를 실행 중인 프로그램
  • 주문형 프로필링 이아피 함께 통합 다른 시스템에 - 프로필
  • 여러 프로세스뿐 지원 (다중 처리), 장고.) 샘플링 / CPU - 라이브 뷰 (시간과 함께 다양한 선택)
  • 결정론적 프로필링 크프로피레 / 프로파일할 통합을 통해 분석 결과 기존 pstat -
  • 오픈 joyon. 파일
  • API 의 프로그램에 액세스하면
  • 그룹에 의해 샘플링합니다 방법 또는 선
  • 피데프 통합공정
  • 피처름 통합공정

참고: # 39 의 상업적 있지만, it& 위한 무료 오픈 소스.

해설 (0)