Использование результатов cProfile с KCacheGrind
-
19-09-2019 - |
Вопрос
Я использую 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)
...
Версии пакета
- КСэшГринд 4.3.1
- Питон 2.6.2
Решение 3
Это можно сделать с помощью внешнего модуля под названием 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), мне все равно было бы очень интересно узнать об этом.
Другие советы
С помощью cProfile вы также можете профилировать существующие программы без создания отдельного сценария профилирования.Просто запустите программу с профайлером
python -m cProfile -o profile_data.pyprof script_to_profile.py
и откройте данные профиля в kcachegrind с помощью pyprof2calltree, чей ключ -k автоматически открывает данные в kcachegrind
pyprof2calltree -i profile_data.pyprof -k
Например, профилирование всего сервера Paster и веб-приложения будет выполняться следующим образом.
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 соответственно.
Если вы на самом деле пытаетесь посмотреть, какие части вашего кода можно оптимизировать по скорости, и можете случайным образом приостановить его в отладчике, этот метод работает.Это может быть удивительно, но вам не нужно много стеков.
3 разных способа профилирования вашего кода и визуализации результатов в KCachegrind/Qcachegrind:
Я - CПРОФИЛЬ
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 – ВСТРОЕННЫЙ CПРОФИЛЬ
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 - ЯППИ
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.filename.prof в kcachegrind.