【发布时间】:2011-10-25 16:24:52
【问题描述】:
我想从对象的角度分析 python 代码。例如:
foo = Foo()
profiled_foo = add_profiling(foo)
# use profiled_foo like foo
...
# later
profiled_foo.print_profile()
我想获得每个方法的调用和每个方法花费的累积时间。我没有找到类似的东西,虽然我认为写起来应该不会太难。
有这样的图书馆吗?或者可能不是因为以这种方式进行分析是个坏主意?
根据 Paul McGuire 的回答:
import inspect
from time import sleep
from profilehooks import profile
class Foo(object):
def a(self):
sleep(0.1)
def b(self):
sleep(0.3)
def c(self):
sleep(0.5)
def add_profiling(obj):
for k in dir(obj):
attr = getattr(obj, k)
if inspect.ismethod(attr) and k != '__init__':
setattr(obj, k, profile(attr))
if __name__ == '__main__':
foo = Foo()
add_profiling(foo)
foo.a()
foo.a()
foo.b()
foo.b()
foo.a()
foo.c()
.
*** PROFILER RESULTS ***
c (oprof.py:13)
function called 1 times
3 function calls in 0.501 CPU seconds
Ordered by: cumulative time, internal time, call count
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.501 0.501 oprof.py:13(c)
1 0.501 0.501 0.501 0.501 {time.sleep}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
0 0.000 0.000 profile:0(profiler)
...
【问题讨论】:
-
有一个与
profilehooks类似的包,但是它也支持火焰图生成和测量任意代码区域,不仅仅是函数调用:github.com/metopa/region_profiler