2014-10-03 3 views
0

파이썬 모듈 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

+0

@matsjoyce 방금 더 많은 코드를 추가했습니다. – user25976

+0

내 추가 참조 – matsjoyce

답변

0

확인을 얻을, 나는 정확한 상황을 모르겠지만, 장식 불구하고 나는 그것을 설정하는 것 :이 코드

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

+0

@ user25976 그리고 나는 또한 업데이트했습니다. – matsjoyce

+0

이것은 내가 뭘 찾고있는 것처럼 보이지만 조금 새로운 것입니다. TypeError : myFunction()은 ret = func (* args, ** kwargs) 행에 정확히 1 개의 인수 (주어진 2 개)를 취합니다. – user25976