Редактировать:
Этот ответ был реализован в https://github.com/campos-ddc/cprofile_graph
Профилирование с помощью cProfile
Вот сообщение, которое я написал некоторое время назад о профилировании с помощью cProfile с некоторыми графическимиaid.
cProfile - один из наиболее часто используемых профилировщиков Python, и хотя он очень мощный, стандартный вывод текста несколько скучнее.Здесь я покажу вам, как проще использовать cProfile в вашем приложении.
Существует два распространенных способа использования cProfile: вы можете использовать его как команду в приглашении для профилирования данного модуля, или выможете использовать его в своем коде для профилирования определенных фрагментов кода.
Профилирование модуля
Чтобы использовать cProfile для профилирования всего модуля, просто введите в командной строке следующую команду:
python -m cProfile -o output_filename.pstats path/to/script arg1 arg2
Это запустит ваш модуль с заданными аргументами (они необязательны) и выведет вывод в файл output_filename.pstats.
Существует множество способов для чтения данныхв этом выходном файле, но для целей данного поста давайте не будем беспокоиться об этом и сосредоточимся на получении этой графической визуализации.
Профилирование изнутри
Иногда вы не хотите профилироватьвесь модуль, всего несколько строк.
Для этого вам нужно добавить некоторый код в ваш модуль.
Прежде всего:
import cProfile
А потом тыможет заменить любой сегмент кода следующим:
cProfile.runctx('Your code here', globals(), locals(), 'output_file')
Например, вот тест до и после профилирования:
import unittest
class Test(unittest.TestCase):
def testSomething(self):
self.DoSomethingIDontCareAbout()
param = 'whatever'
self.RunFunctionIThinkIsSlow(param)
self.AssertSomeStuff() # This is after all, a test
После:
import unittest
import cProfile
class Test(unittest.TestCase):
def testSomething(self):
self.DoSomethingIDontCareAbout()
param = 'whatever'
cProfile.runctx(
'self.RunFunctionIThinkIsSlow(param)',
globals(),
locals(),
'myProfilingFile.pstats'
)
self.AssertSomeStuff() # This is after all, a test
Преобразование файла pstats в график
Чтобы преобразовать файл профилирования в график, вам потребуется несколько вещей:
- gprof2dot : Этот модульпреобразует ваш вывод в файл dot , стандартный формат файла для описания графиков.
- GraphViz : превращает ваш файл dot вimage.
После того, как вы скачали gprof2dot и установили GraphViz , введите в командной строке следующую команду:
python gprof2dot -f pstats myProfileFile | dot -Tpng -o image_output.png
Возможно, вынеобходимо использовать полный путь для gprof2dot и / или dot , или вы можете добавить их в переменную PATH env.
После всего этого вы должны иметьизображение, которое выглядит примерно так:
Более горячие цвета (красный, оранжевый, желтый) указываютфункции, которые занимают больше общего времени выполнения, чем более холодные цвета (зеленый, синий)
На каждом узле вы можете видеть, какой процент от общего времени выполнения использует эта функция и сколько раз онабыл вызван.
Стрелки между узлами указывают, какая функция вызвала другие функции, и такие стрелки также имеют подпись, указывающую, какой процент времени выполнения прошел через них.
Примечание: проценты не всегда будут составлять до 100%, особенно в тех разделах кода, которые ссылаются на код C ++, который не будет профилирован.Кроме того, cProfile не сможет определить, что вызывается из оператора «eval», поэтому вы можете увидеть некоторые скачки на графике.