Профилирование метода класса в Python с использованием cprofile?
Вопрос
Я хотел бы профилировать метод функции в Python, используя cProfile. Я попробовал следующее:
import cProfile as profile
# Inside the class method...
profile.run("self.myMethod()", "output_file")
Но это не работает. Как я могу назвать себя. Метод с «бегом»?
Решение
Используйте декоратор Profilehooks
Другие советы
РЕДАКТИРОВАТЬ: Извините, не понял, что звонок профиля был в метод класса.
run
Просто пытается exec
строка, которую вы проходите. Если self
Не связан ни с чем в сфере использования профилировщика, вы не можете использовать его в run
! Использовать runctx
Метод для прохождения локальных и глобальных переменных в сфере вызова профилировщика:
>>> import time
>>> import cProfile as profile
>>> class Foo(object):
... def bar(self):
... profile.runctx('self.baz()', globals(), locals())
...
... def baz(self):
... time.sleep(1)
... print 'slept'
... time.sleep(2)
...
>>> foo = Foo()
>>> foo.bar()
slept
5 function calls in 2.999 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 2.999 2.999 <stdin>:5(baz)
1 0.000 0.000 2.999 2.999 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 2.999 1.499 2.999 1.499 {time.sleep}
Обратите внимание на последнюю строку: time.sleep
это то, что занимает время.
Я бы не порекомендовал профилировать одну рутину, потому что это подразумевает, что заранее знает, что там есть проблема.
Фундаментальный аспект проблем с производительностью заключается в том, что они подлые. Они не там, где, по вашему мнению, они есть, потому что, если бы они были, вы бы уже решили.
Лучше запустить всю программу с реалистичной рабочей нагрузкой и позволить технике профилирования сообщить вам, где проблемы.
Вот пример где профилирование находит проблему, и это не где ожидается.
Если ваша функция под профилем возвращает значение (ы), вам нужно немного изменить отличный ответ с @KatrielAlex:
... profile.runctx('val = self.baz()', globals(), locals())
... print locals()['val']