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