2014-10-03 76 views
0

我想使用python模塊timeit來爲我的QGIS插件中的某些功能定時。qgis插件的Timeit模塊

在這裏,我調用了函數內的函數,我在最後一個函數結束時調用它。不過,看起來這個插件的運行時間比平常要長,我想知道我是否在錯誤的地方調用了定時器。有沒有更好的方法來設置它?

class myPluginName: 

    def firstFunction(self): 
     ... 
     self.secondFunction() 

    def secondFunction(self): 
     ... 
     self.timeThings() 

    def run(self): 
     self.firstFunction() 

    def timeThings(self): 
     QMessageBox.information(None, 'First Function', 'Time : %s' % timeit.timeit(self.firstFunction,number=1) 
     QMessageBox.information(None, 'Second Function', 'Time : %s' % timeit.timeit(self.secondFunction,number=1) 

更新:在遵循一些建議後,我試圖用以下方式實現包裝。我得到不過,TypeError: firstFunction() takes exactly 1 argument (2 given) on ret = func(**args, **kwargs)

def time_func(func): 
    try: 
     name = func.__name__ 
    except: 
     name = func.f__name 
    def tf_wrapper(*args, **kwargs): 
     t = time.time() 
     ret = func(*args, **kwargs) 
     QMessageLog.logMessage("{}: {}".format(name, time.time() - t)) 
     return ret 
    return tf_wrapper 

class myPlugin: 
    def initGui(self): 
     QObject.connect(self.dlg.ui.comboBox,SIGNAL("currentIndexChanged(int)"), self.firstFunction) 
    @time_func 
    def firstFunc(self): 
     registry = QgsMapLayerRegistry.instance() 
     firstID = str(self.dlg.ui.firstCombo.itemData(self.dlg.ui.firstCombo.currentIndex())) 
     secondID = str(self.dlg.ui.secondCombo.itemData(self.dlg.ui.secondCombo.currentIndex())) 
     self.firstLayer = registry.mapLayer(firstID) 
     self.secondLayer = registry.mapLayer(secondID) 

    @time_func 
    def secondFunc(self): 
     ... 
     self.thirdFunc() 
    def thirdFunct(self): 
     ... 
    def run(self): 
     self.dlg.ui.firstCombo.clear() 
     self.dlg.ui.secondCombo.clear() 
     for layer in self.iface.legendInterface().layers(): 
      if layer.type() == QgsMapLayer.VectorLayer: 
       self.dlg.ui.firstCombo.addItem(layer.name(), layer.id()) 
       self.dlg.ui.secondCombo.addItem(layer.name(), layer.id()) 
     result = self.dlg.exec_() 
     if result == 1: 
      self.secondFunction() 
+0

@matsjoyce我打電話在幾個不同的方式多種功能。第一種是在組合框索引中調用。第二個是在對話框上有一個接受按鈕。我也有從函數內部調用的函數。查看修改。 – user25976 2014-10-07 20:23:23

+0

@matsjoyce我剛添加了更多的代碼 – user25976 2014-10-08 19:07:49

+0

查看我的加入 – matsjoyce 2014-10-08 21:03:14

回答

0

OK,我不知道您的具體情況,但我會設置它雖然裝飾:

import time 

def time_func(func): 
    try: 
     name = func.__name__ 
    except: 
     name = func.f_name 
    def tf_wrapper(*args, **kwargs): 
     t = time.time() 
     ret = func(*args, **kwargs) 
     print("{}: {}".format(name, time.time() - t)) # Or use QMessageBox 
     return ret 
    return tf_wrapper 

class myPluginName: 
    @time_func 
    def firstFunction(self): 
     pass 

    @time_func 
    def secondFunction(self): 
     pass 

    def run(self): 
     self.firstFunction() 
myPluginName().firstFunction() 

有了這個代碼,任何函數包裹在time_func將會花費時間來執行返回時打印的函數以及其名稱。例如。運行它將打印:

firstFunction: 1.430511474609375e-06 

對於您的TypeError,您需要更改;

def firstFunction(self): 
     pass 

要:

def firstFunction(self, index): 
     pass 
+0

謝謝你指出我錯誤的原因。不過,我想知道,如果這是設置。在函數本身中調用timit函數會更好嗎?我現在要更新我的問題,因爲我已經繞過了最初的錯誤。 – user25976 2014-10-03 21:49:42

+0

@ user25976我也更新了。 – matsjoyce 2014-10-04 08:08:40

+0

這看起來就像我正在尋找的東西,但它對我來說有點新鮮。我得到一個TypeError:myFunction()在行ret = func(* args,** kwargs)上只需要1個參數(給出2) – user25976 2014-10-07 18:23:38