2011-10-25 70 views
3

我想从对象的角度来剖析python代码。例如:Python剖析方法

foo = Foo() 
profiled_foo = add_profiling(foo) 

# use profiled_foo like foo 
... 

# later 
profiled_foo.print_profile() 

我想要调用每个方法的每个方法和累积的时间。我没有发现类似的东西,尽管我认为写作不应该太难。

是否有像这样的库存在?或者可能不是因为通过这种方式分析会是一个坏主意?


基于保麦圭尔的回答是:

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) 

... 

回答

1

你可以看一下http://docs.python.org/library/profile.html

我个人认为CPROFILE是蟒蛇更直观和快捷的分析工具。

要分析单个类,您可以编写简单的测试脚本并使用cProfile运行它们。

1

你可能已经听说过这一点,但快有一个区别分析之间为了自身的利益,而使用使代码运行的客观剖析为可能。

这很好,您希望每个方法的累计时间总计超过对该方法的所有调用,因为如果将该方法除以总执行时间,则可以获得方法负责的时间百分比。 如果有人可以修复以获得更好的速度,那么它就是自己代码中的高百分比方法。

比获得高累积百分比的方法更好的方法是获得高累积百分比的代码行。 这是因为如果您想查看问题出现的方法,您正在寻找具有高百分比的特定代码行。 因此,如果您的分析器告诉您这些行在哪里,您已经拥有(取决于方法大小),可能在定位问题时的精度更高一个数量级。

即使知道你的代码中具有高百分比的行的位置,也知道它们可能被执行的上下文。

有些人认为有必要做的一件事是获得准确的时间测量。然而,一旦你在你的代码中找到一条明确表示获得良好加速的机会,因为删除 - 替换 - 以不同的方式执行它会节省大量的总体时间,如果你对该百分比的估计是关闭的,真的很重要一点点? 假设您找到该行,并认为它的成本为50%。 如果修复它的实际节约成本只有30%或70%,那么你是否花时间修复它会感觉不好?

这就是为什么我鼓励堆栈采样,为此this is a small example

堆栈样本自动为您提供行级百分比,因为一行的百分比成本只是包含它的样本的百分比。 它们自动包含阻塞时间,例如I/O,这是您需要知道的,因为它会影响整体时间。 如果采集100个或1000个样本,您可以获得高精度的测量结果,但一些非常简单的统计数据证明,除了最小的问题外,少量样本足以精确定位问题。 最后,告知线条是否被良好使用的上下文位于样本中。 许多探查者将样本拼凑在一起以获取数字,但不要让用户看到具有代表性的样本。因此,他们倾向于假定“热”的代码行是必要的,但实际上上下文可以告诉他们它不是。

这是more extensive listing of the issues