Использование результатов cProfile с помощью KCacheGrind

Я использую 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
  • Python 2.6.2

Ответ 1

Это можно сделать с помощью внешнего модуля, называемого 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) модуля, мне все равно будет интересно узнать об этом.

Ответ 2

С помощью cProfile вы можете также профилировать существующие программы без отдельного профилирования script. Просто запустите программу с профилировщиком

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

и открыть данные профиля в kcachegrind с pyprof2calltree, чей ключ -k автоматически открывает данные в kcachegrind

pyprof2calltree -i profile_data.pyprof -k

Например, профилирование всего paster-сервера и webapp будет выполнено следующим образом

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

pyprof2calltree можно установить с помощью easy_install.

Ответ 3

Вы можете использовать profilestats.profile decorator ($ pip install profilestats) - простая обертка для pyprof2calltree (ребрендинг lsprofcalltree.py):

from profilestats import profile

@profile
def func():
    # do something here

Script может выполняться как обычно. profilestats создает два файла: cachegrind.out.profilestats и profilestats.prof в форматах KCachegrind и cProfile соответственно.

Ответ 4

Если то, что вы на самом деле пытаетесь сделать, это увидеть, какие части вашего кода можно оптимизировать для скорости, и вы можете случайным образом приостановить его в отладчике, этот метод работает. Это может быть удивительно, но вам не нужно очень много стеков.

Ответ 5

3 разных способа профилирования кода и визуализации результатов в KCachegrind/Qcachegrind:

я - CPROFILE

1 - Профиль myfunc() из ipython

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

2 - Преобразуйте свой файл в файл kcachegrind, который можно использовать в вашей оболочке

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

3 - Откройте команду callgrind.filename.prof в kcachegrind

II - ПОКРЫТИЕ С ПОМОЩЬЮ

1 - проведите несколько строк в вашем коде.

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

2 - Преобразуйте свой файл в файл kcachegrind, который можно использовать в вашей оболочке

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

3 - Откройте команду callgrind.filename.prof в kcachegrind

III - YAPPI

1 - Профиль myfunc() из ipython или из вашего кода

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 - Откройте файл вызоваgrgr.filename.prof в kcachegrind