Использование результатов 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.имя файла.проф в программа