Использование результатов 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

5 ответов


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

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.


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

from profilestats import profile

@profile
def func():
    # do something here

скрипт можно запустить как обычно. profilestats создает два файла: cachegrind.out.profilestats и profilestats.prof в форматах KCachegrind-совместимых и 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), мне все равно было бы очень интересно услышать об этом.


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


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

I-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.имя файла.проф в программа

II-ВСТРОЕННЫЙ CPROFILE

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

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

2 - конвертировать файл в файл полезная программа в командной строке

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

3 - открыть callgrind.имя файла.проф в программа

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 - Открыть callgrind.имя файла.проф в программа