Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top