Было около 8-9 лет назад я увидел инструмент для Visual Studio (я действительно не помню имя), который может визуализировать вызовы функций и их производительность. Мне очень понравилось, поэтому мне было интересно, есть ли что-то подобное в Python. Скажем, у вас есть три функции:
def first_func():
...
def second_func():
...
for i in xrange(10):
first_function()
...
def third_func():
...
for i in xrange(5):
second_function()
...
Итак, окончательный отчет этого инструмента был примерно таким (включая диаграммы соединений):
first_func[avg 2ms] <--50 times--< second_func[avg 25ms] <--5 times--< third_func[avg 140ms]
Такой инструмент облегчит поиск узких мест в системе. Особенно для больших систем.
Вы можете использовать профилировщик в комплекте с установкой python. Ссылка на профайлер Python
Пошаговое время и частота выполнения с профилировщиком:
Сначала установите line_profiler
Во-вторых, измените исходный код, украсив функцию, которую вы хотите измерить, с помощью декоратора @profile.
В-третьих, kernprof -l -v yourscript.py
Опция -l
сообщает kernprof вставлять декоратор @profile в ваши встроенные функции script, а -v
сообщает kernprof отображать информацию о времени, как только вы закончите script.
выход:
Общепринято думать, что вам нужно знать, сколько раз вы называете вещи, сколько времени они берут (self vs. inclusive), а кто - звонит - кто сколько времени. Тогда вы можете надеть свою детективную кепку и, надеюсь, раскрыть, где проблема.
Существует еще один подход, который заключается в том, чтобы спросить не о функциях, а о строках кода, каков процент времени настенных часов в стеке. Причина в том, что если такую строку кода можно было бы сделать, чтобы не тратить время, избегая ее или удаляя ее или выполняя ее работу по-другому, этот процент может быть сохранен. Вам не обязательно быть детективом, чтобы точно определить это. Любое узкое место в вашем коде должно появляться в виде такой строки, и точные проценты не важны. Вот пример.