如何评测python应用程序的类方法?

2024-10-01 07:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

过去,我在同一个文件中编写了所有函数的python代码,我可以使用以下代码来评测我的程序:

这是我写的一个装饰师:

def do_profile(cond):
    def resdec(f):
        if not cond:
            return f
        return profile(f)
    return resdec

我就是这样使用它的:

^{pr2}$

然后在脚本上调用kernprof.py

kernprof.py  -l my_program.py

在此期间,我对OOP更加熟悉,我把我的程序重写成许多类,程序现在是这样启动的:

 if __name__ == "__main__":
     my_app = myApp()
     my_app.run()

myApp是一个与其他类通信频繁的类:

class myApp():
    @do_profile(DO_PROFILE)
    def foo_method(self, arg1):
        pass

我在每个myApp方法前面添加了do_profile修饰符,但是如果我运行kernprof.py,得到的{}文件是空的

那么,分析类的方法的最简单方法是什么?我真的很想用一个装饰工和一个旗子来打开/关闭这个。在

EDIT1:我对这里最简单的解决方案很感兴趣。找一个装修师是一个优雅的解决方案,但也许事情可以做得更容易。我不想使用类似cProfile'sprofileprofile.runctx('self.baz()', globals(), locals())之类的东西。在处理许多类和方法时,这不是一个实用的解决方案。在


Tags: 文件方法代码py程序returnmydef
2条回答

profile函数本身就是一个装饰器,与大多数装饰器一样,它们只需要应用于函数。在

幸运的是,类方法基本上是在创建实例时绑定到实例的函数。因此,您可以将decorator应用于任何类方法,方法是将其放入类定义中:

class myApp(object):
    @do_profile(DO_PROFILE)
    def foo_method(self, arg1):
        pass

    @do_profile(DO_PROFILE)
    def bar_method(self, arg2):
        pass

如果使用Python2.6或更高版本,还可以创建一个class decorator并将profile修饰符应用于任何给定类的所有方法。您可以通过将decorator放在类定义之前来应用它:

^{pr2}$

这样的装饰师可能看起来像这样:

import types

def do_profile_all_methods(cond):
    if not cond:
        return lambda c: c # Do nothing with the class; the 'null' decorator
    def profile_all_methods(klass):
        for name, attr in klass.__dict__.items():
            if isinstance(attr, types.UnboundMethodType):
                klass[name] = profile(attr)
        return klass
    return profile_all_methods

此修饰符只将profile包装应用于直接方法,而不是从基类继承的任何方法。在

看看Yappi

要分析一段代码,只需使用:

import yappi
[...]
yapp.start()
some_function_that_needs_profiling()
yappi.print_stats()

相关问题 更多 >