使用 cProfile 在 Python 中分析类的方法?

问题描述 投票:0回答:5

我想使用 cProfile 来分析 Python 中函数的方法。我尝试了以下方法:

import cProfile as profile

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

但这不起作用。如何使用“run”调用 self.method?

python profiler cprofile
5个回答
74
投票

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
是占用时间的内容。


32
投票

使用 profilehooks 装饰器

http://pypi.python.org/pypi/profilehooks


5
投票
  import cProfile
  p = cProfile.Profile()
  p.runcall(self.myMethod)
  p.print_stats()

Profile
类已记录在here


4
投票

如果您的配置文件下的函数返回值,您需要稍微更改@katrielalex 的优秀答案:

...             profile.runctx('val = self.baz()', globals(), locals())
...             print locals()['val']

0
投票

我不建议分析单个例程,因为这意味着提前知道那里存在问题。

性能问题的一个基本方面是它们是偷偷摸摸的。 它们并不在您认为的位置,因为如果它们在,您早就解决了它们。

最好以实际工作负载运行整个程序,并让分析技术告诉您问题出在哪里。

这是一个示例,其中分析发现了问题,但它不是预期的地方。

© www.soinside.com 2019 - 2024. All rights reserved.