【问题标题】:Python profiling methodsPython 分析方法
【发布时间】: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)

...

【问题讨论】:

标签: python profiling


【解决方案1】:

我在使用这些装饰器方面取得了相当大的成功:http://mg.pov.lt/profilehooks/

【讨论】:

    【解决方案2】:

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

    在我个人看来,cProfile 是更直观、更快速的 python 分析工具。

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

    【讨论】:

      【解决方案3】:

      您可能以前听说过这个,但是为了分析本身而进行分析与为了使代码尽可能快地运行而进行分析是有区别的。

      您希望每个方法的累积时间与对该方法的所有调用相加,因为如果您将其除以总执行时间,您将得到该方法负责的时间百分比。 如果有什么可以修复以获得更快的速度,它是在自己的代码中的高百分比方法之一。

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

      比知道高百分比的代码行的位置更好的是知道它们可能被执行的上下文。

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

      这就是我鼓励堆栈采样的原因,为此this is a small example

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

      这是more extensive listing of the issues

      【讨论】:

        猜你喜欢
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多