Первое число - это процент от общего объема использованной памяти / времени, потраченного на функцию, а второе - процентное соотношение использованной памяти / времени, потраченного на функцию, которое не выделено / потрачено в внутренние функции.Часто они называются включающим (включая функции в функции) и исключительным (исключая функции в функции) профилированием.
Я объясню это для таймингов, но то же самое работает для профилирования памяти.
Это потому, что профилировщики просто измеряют, сколько времени занимает каждый вызов функции.Например, если у вас есть:
def func1():
# something
func2()
# something
def func2():
# something
И давайте предположим, что профилировщик для func1()
мер вызова 1000 мс расходуется в func1
, а 750ms
расходуется в func2
, тогда числа будут:
func1 100% 25%
func2 75%
Поскольку 100% времени тратится на func1
- но только 25% ((1000 мс - 750 мс) / 1000 мс) времени тратится на func1
, что не потрачено на func2
.Аналогично, 75% (750 мс / 1000 мс) расходуется в общей сложности func2
.В этом примере второе число для func2
также будет равно 75%, потому что я не включил туда никакого кода, но если бы внутри были другие функции, то была бы применена та же математика.Так что, чтобы не путать, я не включил его туда.
Чтобы сделать его более интересным и включить другой пример, предположим, что у вас есть:
def func1():
# something
func2()
# something
func3()
# something
def func2():
# something
def func3():
# something
А профилировщик измеряет 1000 мс в func1
, 200 мс в func2
и 500 мс в func3
таблица будет выглядеть так:
func1 100% (1000 / 1000) 30% ((1000 - 200 - 500) / 1000)
func2 20% ( 200 / 1000)
func3 50% ( 500 / 1000)