计算调用函数或变量的次数

时间:2012-02-14 14:39:31

标签: python

我想从python中编写的现有代码中获取每个函数或变量的调用时间。

我的想法是覆盖对象的 getattribute 函数,如下所示:

acc = {}

class object(object):
    def __getattribute__(self, p):
        acc.update({str(self) + p: acc.get(str(self) + p, 0) + 1})
        return supe(object, self).__getattribute__(p)

class A(object):
    def a(self):
        pass

class B(A):
    def b(self):
        pass

def main():
    a = A()
    a.a()
    b = B()
    b.b()
    b.a = 'a'
    b.a

    print acc
if __name__ == '__main__':
    main()

但是,它只能计算对象中的函数和变量,如何计算正常函数或变量,例如:

def fun1():
    pass
fun1()
fun1()

我想将结果设为2,是否有任何工具或方法可以做到?

对不起我的游泳池英语,我真正需要的是被调用的时间而不是运行时间。 如上所述,我们说,fun1()被调用两次。

2 个答案:

答案 0 :(得分:2)

使用decorator

>>> def timestamp(container, get_timestamp):
...      def timestamp_decorator(func):
...          def decorated(*args, **kwargs):
...              container[func.func_name] = get_timestamp()
...              return func(*args, **kwargs)
...          return decorated
...      return timestamp_decorator
... 

你这样使用它:

>>> import datetime
>>> def get_timestamp():
...     return datetime.datetime.now()
... 
>>> timestamps = {}
>>> @timestamp(timestamps, get_timestamp)
... def foo(a):
...     return a * 2
... 
>>> x = foo(2)
>>> print x, timestamps
4 {'foo': datetime.datetime(2012, 2, 14, 9, 55, 15, 789893)}

答案 1 :(得分:0)

有一种方法可以为函数创建一个计数器装饰器(nbot一个时间戳装饰器) - 并使用这个装饰器自动包装给定模块中的所有函数 -

所以,如果要计算函数调用的模块名为“mymodule”,你可以写:

class function_counter(object):
    def __init__(self, func):
        self.counter = 0
        self.func = func

    def __call__(self, *args, **kw):
        self.counter += 1
        return self.func(*args, **kw)

>>> @function_counter
... def bla():
...     pass
... 
>>> 
>>> bla()
>>> bla()
>>> bla()
>>> bla.counter
3

要将其应用于模块中的所有函数,您可以编写如下内容:

import mymodule
from types import FunctionType, BuiltinFunctionType
# define the "function_counter" class as above here (or import it)

for key, value in mymodule.__dict__.items():
    if isinstance(value, (FunctionType, BuiltinFunctionType)):
        mymodule.__dict__[key] = function_counter(value)

这可以用于计算功能使用情况。 如果你想计算模块级变量的用法,那就不那么容易了 您不能像在示例中那样覆盖从模块对象检索的机制属性。

去那里的方法是用你的模块替换一个类 - 在你的例子中实现属性计数方案 - 在导入模块之后 - 并且将所有模块属性分配给这个实例属性类。

这不是一个经过测试的例子(与上面不同),但尝试一下:

import mymodule

from types import FunctionType

class Counter(object):
   # counter __getattribute__ just as you did above

c = Counter()
for key, value in mymodule.__dict__.items():
    setattr(c, key, staticmethod(value) if isinstance(value, FunctionType) else value)
mymodule = c
相关问题