Python函数修饰符调用

Python函数修饰符调用,python,decorator,Python,Decorator,我有一个函数,它被调用了1742次,但是当我做一个decorator来计算它的每次调用时间时,我发现它只打印了647次,我不知道为什么会这样 更新: 我这里的问题不在于如何利用调用数之间的差异来计时,我想要一种方法来生成一个具有精确调用的类似于decorator的函数 我的python版本是2.6,下面是我正在使用的模块 在分析输出中,我发现修饰函数的调用者函数只调用647,而且它是唯一的调用者函数 明白了 我修饰的函数中有一个长度为1742的循环,但实际对该函数的调用只有647,尽管我仍

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

更新:

  • 我这里的问题不在于如何利用调用数之间的差异来计时,我想要一种方法来生成一个具有精确调用的类似于decorator的函数

  • 我的python版本是2.6,下面是我正在使用的模块

  • 在分析输出中,我发现修饰函数的调用者函数只调用647,而且它是唯一的调用者函数

明白了

  • 我修饰的函数中有一个长度为1742的循环,但实际对该函数的调用只有647,尽管我仍然不明白为什么它在calls部分中显示1742而不是647:)


我在粘贴箱上看到了你粘贴的代码。问题是您正在包装一个类的
\uuuu iter\uuu
方法。对于启动的每个循环,只调用一次。它应该立即返回一个迭代器对象——可以利用的是对
\uuu iter\uuuu
返回的对象上的“next”方法的调用(这是在每个
循环交互中调用的)

这意味着在不改变任何内容的情况下,您可以在taht
\uuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中的
语句周围以其他方式使用该代码,而不是将您


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

我在粘贴箱上看到了您粘贴的代码。问题是您正在包装一个类的
\uuuu iter\uuu
方法。对于启动的每个循环,只调用一次。它应该立即返回一个迭代器对象——可以利用的是对
\uuu iter\uuuu
返回的对象上的“next”方法的调用(这是在每个
循环交互中调用的)

这意味着在不改变任何内容的情况下,您可以在taht
\uuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中的
语句周围以其他方式使用该代码,而不是将您


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

这是一种可怕的函数调用计时方式。看看python分析器:提供更多证据。装饰代码看起来不错。我不相信你的说法……Python已经有了做这类事情的模块。我自己也试过了。您所描述的不会发生-正如预期的那样,您所描述的将是一个严重的bug,并且在一周内不会被忽视。发布更多详细信息(Python版本,如何运行它,如果不是太多的话,可能还涉及其他代码),或者我们无能为力。线程可能会弄乱计数器,但差异应该是10%,而不是70%。代码很好,工作也很好,如果你希望得到一个答案,你必须发布实际产生问题的可运行代码。这是一种可怕的函数调用计时方式。看看python分析器:提供更多证据。装饰代码看起来不错。我不相信你的说法……Python已经有了做这类事情的模块。我自己也试过了。您所描述的不会发生-正如预期的那样,您所描述的将是一个严重的bug,并且在一周内不会被忽视。发布更多详细信息(Python版本,如何运行它,如果不是太多的话,可能还涉及其他代码),或者我们无能为力。线程可能会弄乱计数器,但差异应该是10%,而不是70%。代码很好,工作也很好,如果您希望得到答案,您必须发布实际产生问题的可运行代码。
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