programing

KCacheGrind에서 cProfile 결과 사용

sourcetip 2021. 1. 17. 12:40
반응형

KCacheGrind에서 cProfile 결과 사용


cProfile을 사용하여 Python 프로그램을 프로파일 링하고 있습니다. 이 강연을 바탕으로 KCacheGrind가 cProfile의 출력을 구문 분석하고 표시 할 수 있다는 인상을 받았습니다.

그러나 파일을 가져올 때 KCacheGrind는 상태 표시 줄에 '알 수없는 파일 형식'오류 만 표시하고 아무것도 표시하지 않습니다.

내 프로파일 링 통계가 KCacheGrind와 호환되기 전에 특별히해야 할 일이 있습니까?

...
if profile:
    import cProfile

    profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'

    profile = cProfile.Profile()
    profile.run('pilImage = camera.render(scene, samplePattern)')

    profile.dump_stats(profileFileName)
    profile.print_stats()
else:            
    pilImage = camera.render(scene, samplePattern)
...

패키지 버전

  • KCacheGrind 4.3.1
  • 파이썬 2.6.2

cProfile을 사용하면 별도의 프로파일 링 스크립트를 만들지 않고도 기존 프로그램을 프로파일 링 할 수 있습니다. 프로파일 러로 프로그램 실행

python -m cProfile -o profile_data.pyprof script_to_profile.py

pyprof2calltree를 사용하여 kcachegrind에서 프로필 데이터를 엽니 다. -k 스위치는 kcachegrind에서 데이터를 자동으로 엽니 다.

pyprof2calltree -i profile_data.pyprof -k

예를 들어 전체 paster 서버 및 webapp 프로파일 링은 다음과 같이 수행됩니다.

python -m cProfile -o pyprof.out `which paster` serve development.ini

pyprof2calltree는 easy_install로 설치할 수 있습니다.


profilestats.profile데코레이터 ( $ pip install profilestats) -pyprof2calltree 모듈에 대한 간단한 래퍼 ( )를 사용할 수 있습니다 lsprofcalltree.py.

from profilestats import profile

@profile
def func():
    # do something here

스크립트는 평소처럼 실행할 수 있습니다. profilestats: 두 개의 파일 생성 cachegrind.out.profilestatsprofilestats.profKCachegrind 호환과 cprofile 명령 형식 대응을.


lscallproftree 라는 외부 모듈을 사용하여 수행 할 수 있습니다.

이 문서에서는 방법을 설명합니다. CherryPy-CacheGrind

결과 코드는 다음과 같습니다.

...
if profile:
    import cProfile
    import lsprofcalltree

    profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'

    profile = cProfile.Profile()
    profile.run('pilImage = camera.render(scene, samplePattern)')

    kProfile = lsprofcalltree.KCacheGrind(profile)

    kFile = open (profileFileName, 'w+')
    kProfile.output(kFile)
    kFile.close()

    profile.print_stats()    
else:            
    pilImage = camera.render(scene, samplePattern)
...

외부 (즉, Python과 함께 제공되지 않음) 모듈이 필요없는이 작업을 수행하는 방법을 아는 사람이 있다면 여전히 그것에 대해 듣고 싶습니다.


If what you're actually trying to do is see what parts of your code could be optimized for speed, and you can randomly pause it in the debugger, this method works. It may be surprising, but you don't need very many stackshots.


3 differents ways to profile your code and visualizing results in KCachegrind/Qcachegrind:

I - CPROFILE

1 - Profile myfunc() from ipython

import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)

2 - Convert your file to a usable kcachegrind file in your shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Open callgrind.filename.prof in kcachegrind

II - EMBEDDED CPROFILE

1 - Profile few lines in your code.

import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)

2 - Convert your file to a usable kcachegrind file in your shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Open callgrind.filename.prof in kcachegrind

III - YAPPI

1 - Profile myfunc() from ipython or from your code

import yappi
filename = 'callgrind.filename.prof'
yappi.set_clock_type('cpu')
yappi.start(builtins=True)
myfunc()
stats = yappi.get_func_stats()
stats.save(filename, type='callgrind')

2 - Open callgrind.filename.prof in kcachegrind

ReferenceURL : https://stackoverflow.com/questions/1896032/using-cprofile-results-with-kcachegrind

반응형