qgis插件的Timeit模块

时间:2014-10-03 20:24:15

标签: python qgis

我想使用python模块 timeit 来计算我的QGIS插件中的某些功能。

在这里,我调用了它在我在最后一个函数末尾调用的函数中运行的时间。但是,似乎该插件比平常运行的时间更长,我想知道我是否在错误的地方调用计时器。有没有更好的方法来设置它?

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()

1 个答案:

答案 0 :(得分: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