2011-04-04 61 views
1

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

更新:

  • 我这里的问题不是如何使呼叫的数量之间的差异定时的,我想办法做出那样的有准确调用功能的装饰。

  • 我的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 
+4

这是定时函数调用的一种可怕的方式。看看python性能分析器:http://docs.python.org/library/profile.html – ChristopheD 2011-04-04 19:02:37

+0

这不是你如何在Python中进行性能分析。 – 2011-04-04 19:03:13

+3

提供更多证据。装饰器代码看起来很好。我不相信你的说法...... – 2011-04-04 19:03:52

回答

5

我看到你贴的代码 - 在引擎收录。问题在于你正在包装类的__iter__方法。对于每个启动的循环只调用一次。并且它会返回imediatelly与一个迭代器对象 - 什么是prof profbleble是调用__iter__返回的对象上的“下一个”方法(这就是每个for循环interacton称为)。

这意味着,在不改变任何东西,而不是使用分析器作为上__iter__呼叫的装饰你使用这些代码以其他方式围绕yield语句中taht __iter__

除此之外,你将更好地使用timeit.timeit或其他已有的配置文件来避免这些陷阱,如评论中所列。