2011-04-04 58 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或其他已有的配置文件來避免這些陷阱,如評論中所列。