2010-08-31 25 views
4

我在類的實例中計算函數時遇到了一些麻煩。我不確定我是以正確的方式去做的(從來沒有用過timeIt),我嘗試了第二個參數導入的一些變化,但沒有運氣。這是我正在做的一個愚蠢的例子:Python - 類中的Timeit

import timeit 

class TimedClass(): 
    def __init__(self): 
     self.x = 13 
     self.y = 15 
     t = timeit.Timer("self.square(self.x, self.y)") 
     try: 
      t.timeit() 
     except: 
      t.print_exc() 

    def square(self, _x, _y): 
     print _x**_y 

myTimedClass = TimedClass() 

哪跑,抱怨自我。

Traceback (most recent call last): 
    File "timeItTest.py", line 9, in __init__ 
    t.timeit() 
    File "C:\Python26\lib\timeit.py", line 193, in timeit 
    timing = self.inner(it, self.timer) 
    File "<timeit-src>", line 6, in inner 
    self.square(self.x, self.y) 
NameError: global name 'self' is not defined 

這與TimeIt創建一個小的虛擬環境來運行的功能,但我有什麼要傳遞給第二個參數,使這一切快樂呢?

+0

你有你爲什麼要到類的__init__內使用timeit任何具體的原因是什麼? 你應該只是時間從「外部」的函數調用: t = timeit.Timer(「myTimedClass.square(x,y)」) Btw「myTimedClass」不是一個靈感的名字,因爲這是一個實例TimedClass,不是一個類。 – 2010-08-31 12:56:11

+0

在我的真實程序中,我需要從外部文件讀取一堆數據來設置對象。閱讀代碼我從__init__分離到另一個函數,以防我需要稍後再次更新對象。由於我正在運行一堆實例,並且它們自己進行文件加載,所以我希望它們都能夠自己調整時間。 在我上面發佈的簡單例子中,當然我可以從外面計時,但這對我的真實項目沒有幫助。 – DizzyDoo 2010-08-31 13:18:24

回答

9

如果您願意考慮timeit的替代方案,我最近發現了stopwatch計時器實用程序,它可能對您的情況有用。它也非常簡單和直觀:

import stopwatch 

class TimedClass(): 

    def __init__(self): 
     t = stopwatch.Timer() 
     # do stuff here 
     t.stop() 
     print t.elapsed 
+5

比計算'timeit'要簡單得多。 Python對'timeit'的所有屬性都有很好的分解,但是如何使用它來剖析代碼的解釋和例子令人困惑。 – Kumba 2012-01-28 01:34:53

9

爲什麼你想讓課堂內部的時間自行計時?如果你把時間從班上拿出來,你可以通過一個參考。即(當然這個類本身是多餘的,我假設你有一個複雜的用例,其中一個簡單的方法是不夠的)。

一般來說,只需傳遞一個包含所有設置/可配置的可調用對象。如果你想傳遞一個字符串進行計時,他們應該包含在其內部的所有必要的設置,即

timeit.Timer("[str(x) for x in range(100)]").timeit() 

如果你真的需要這個類裏面的時間,包裹在一個本地方法的調用,即

def __init__(self, ..): 
    def timewrapper(): 
     return self.multiply(self.x, self.y) 

    timeit.Timer(timewrapper) 
+0

綜合答案。我會看看使用timewrapper。謝謝! – DizzyDoo 2010-08-31 16:10:15

+0

非常感謝幫助 – Freelancer 2013-09-05 14:04:06

0

(發佈作爲回答,因爲代碼標記不會在評論工作)

我想補充一個try /終於關閉了額外的安全性:

class TimedClass(): 
    def __init__(self): 
    t = stopwatch.Timer() 
    try: 
     # do stuff here, you can even use return "foo" here and throw exceptions 
    finally: 
     t.stop() 
     print t.elapsed 
1

爲了解決您最初的錯誤,你可以在一個類中使用timeit像這樣的參數:

t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()