繁体   English   中英

Python函数装饰器调用

[英]Python function decorator calls

我有一个被称为1742次的函数,但是当我做一个装饰器来计算它的每个调用时间时,我发现它只能打印647次,我不知道为什么会这样。

更新:

  • 我这里的问题不在于如何根据调用次数之间的差异来计时,我想要一种使装饰器像函数那样具有精确调用的方法。

  • 我的python版本是2.6,这是我正在使用的模块http://pastebin.com/MXu1pLWM

  • 在分析输出中,我发现装饰函数的调用方函数仅调用647,这是唯一的调用方函数!

想通了!

  • 我装饰的功能在其中有一个循环,长度为1742,但是对该功能的实际调用仅为647,尽管我仍然不明白为什么它在调用部分而不是647上说1742 :)

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

我在pastebin上看到了您粘贴的代码。 问题是您要包装类的__iter__方法。 每个启动的循环仅调用一次。 而且它应该立即通过迭代器对象返回-可以分析的是对__iter__返回的对象的“ next”方法的调用(这是每个for循环交互子中所调用的)。

这意味着,如果没有在通话中进行任何更改,而不是使用您的分析器作为装饰,以__iter__你会使用该代码在一些其他方式的yield语句中taht __iter__

除此之外,您最好使用timeit.timeit或其他现有的配置文件来避免此类陷阱,如注释中所列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM