我想从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()被调用两次。
答案 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