Python函数装饰器调用

Waz*_*ery 1 python decorator

我有一个约1742次调用的函数,但当我做一个装饰器来计算它的每个调用时间时,我发现它只打印了647次,我不知道为什么会发生这种情况.

更新:

  • 我的问题不在于如何使用调用次数之间的差异来计算时间,我想要一种方法来使装饰器像具有准确调用的函数一样.

  • 我的python版本是2.6,这是我在http://pastebin.com/MXu1pLWM上工作的模块

  • 在分析输出中,我发现对装饰函数的调用函数只调用它647,它是唯一的调用函数!!

想通了!

  • 我装饰的函数有一个循环,长度为1742但实际调用函数只有647,虽然我仍然不明白为什么它说1742在调用部分而不是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
Run Code Online (Sandbox Code Playgroud)

jsb*_*eno 5

我看到你粘贴的代码 - 在pastebin上.问题是你正在包装__iter__类的方法.它只对每个启动的循环调用一次.并且它会使用迭代器对象返回imediatelly - 对于返回的对象上的"next"方法的调用__iter__是什么(这是在每个for循环interacton中调用的).

这意味着在不改变任何东西的情况下,不是在调用时使用你的探查器作为装饰器,而是以__iter__其他方式使用该代码在yieldtaht内部的语句中__iter__

除此之外,您最好使用timeit.timeit或其他已存在的配置文件来避免此类陷阱,如评论中所列.