我有一个约1742次调用的函数,但当我做一个装饰器来计算它的每个调用时间时,我发现它只打印了647次,我不知道为什么会这样。
更新:
我的问题不在于如何使用调用次数之间的差异来计算时间,我想要一种方法来使装饰器像具有准确调用的函数一样。
我的python版本是2.6,这是我正在处理的模块http://pastebin.com/MXu1pLWM
在剖析输出中,我发现装饰函数的调用函数只调用它647,它是唯一的调用函数!!。
想通了!
number = 0
def timing(f):
def wrap(*args):
time1 = time.time()
ret = f(*args)
time2 = time.time()
global number
number+=1
print '%s function took %0.6f ms No of calls: %s' % (f.func_name, ((time2-time1)), str(number))
return ret
return wrap
答案 0 :(得分:5)
我看到你粘贴的代码 - 在pastebin上。问题是你正在包装类的__iter__
方法。它只对每个启动的循环调用一次。并且它会使用迭代器对象返回imediatelly - 对于__iter__
返回的对象上的“next”方法的调用(这是每个for
循环中调用的内容) 。
这意味着无需更改任何内容,而不是在调用__iter__
时将探查器用作装饰器,而是以taht {{1}内的yield
语句的其他方式使用该代码}}
除此之外,您最好使用timeit.timeit或其他已存在的配置文件来避免此类陷阱,如评论中所列。