Python 函数装饰器调用

标签 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

最佳答案

我在pastebin上看到了你粘贴的代码。问题是您正在包装类的 __iter__ 方法。对于每个启动的循环,仅调用一次它。它应该立即返回一个迭代器对象——可分析的是对 __iter__ 返回的对象上的“next”方法的调用(这是每个 for< 中调用的方法)/code> 循环交互)。

这意味着在不进行任何更改的情况下,您可以在 yield 周围以其他方式使用该代码,而不是在调用 __iter__ 时使用探查器作为装饰器taht 内的语句 __iter__

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

关于Python 函数装饰器调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5542993/

相关文章:

类构造函数上的 JavaScript 装饰器

javascript - 如何将数据从javascript传递到django?

python - 使用装饰器检查可选参数

python - 从 PDF 上的 Google Vision API OCR 获取线条和段落,而不是符号

python - 在 Django 中交叉检查日期时,lte 和 gte 查询不一致

Python装饰器类: How to correctly count function calls in a with block

python - 如何测试 View 是否装饰有 "login_required"(Django)

javascript - Typescript:访问装饰器声明中类的其他函数/属性

python - 如何继承 int 并使用 isinstance 来识别它的实例?

python - 无法在 Python 中导入我自己的模块