Профилирование метода класса в Python с использованием cprofile?

StackOverflow https://stackoverflow.com/questions/4492535

  •  12-10-2019
  •  | 
  •  

Вопрос

Я хотел бы профилировать метод функции в Python, используя cProfile. Я попробовал следующее:

import cProfile as profile

# Inside the class method...
profile.run("self.myMethod()", "output_file")

Но это не работает. Как я могу назвать себя. Метод с «бегом»?

Это было полезно?

Решение

Используйте декоратор Profilehooks

http://pypi.python.org/pypi/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']
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top