PyQwt QwtPlot慢

时间:2013-09-12 15:56:46

标签: qt qwt

我正在使用PyQwt绘制一个中等数据集(666528点),并且需要花费很长时间来重新绘制缩放等等。

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    2.115    2.115    2.116    2.116 {built-in method replot}

我期待的东西接近100mS而不是2.1秒

看起来其他人在Qwt上遇到了同样的问题,但是解决方案的消息都与Qwt6中的选项有关,但是v5只有python绑定。
因此,我正在使用Qwt版本5.2.1和Python 2.7.2。

在Qwt6中,建议是为ClipPolygons,FilterPoints,MinimizeMemory,ImageBuffer设置Paint属性。根据我的理解,问题在于绘制所有可能映射到相同像素的点,并且油漆一遍又一遍地重新绘制相同的像素,而不是仅仅绘制像素一次。

我已尝试在Plot Curve上设置一些我可用的属性,如下所示,但速度没有明显差异。

def addSignals(self, signals):
    for signal in signals:
        curve = QwtPlotCurve(signal.name())
        curve.setPaintAttribute(QwtPlotCurve.PaintFiltered, False)
        curve.setPaintAttribute(QwtPlotCurve.ClipPolygons, True)
        curve.setData(signal.x(), signal.y())
        curve.setRenderHint(QwtPlotItem.RenderAntialiased)
        curve.setPen(QPen(Qt.cyan))
        curve.attach(self)
    self.replot()

通过setData加载到PlotCurve对象的数据是来自信号对象的numpy数组。并且所示方法附加到子类QwtPlot对象

我是否错过了我的Qwt版本中可用的选项,还是仅在v6中实用? 我有什么选择加快这个速度?

由于

2 个答案:

答案 0 :(得分:1)

嗯,Qwt 5对你的用例来说不应该慢得多。

更重要的是使用了什么版本的Qt以及背后的图形系统类型:f.e Q4 / X11是硬件加速的。

但至少一个容易看到的代码性能问题是抗锯齿:

你可以在深度放大时启用它(在这种情况下它没有问题,因为几乎所有多边形都被剪掉了),但是当显示超过600000行时,它完全没有意义。

显示多个点的数据集背后的总体思路(> Q> 60000在QPainter方面不再适中)是为不同的缩放级别实现多个数据集。这里QwtPlotWeedingFitter可以提供帮助(不要在replot中使用它!) - 但是你需要Qwt6。

但更好地询问Qwt支持频道,我不经常在这里阅读。

答案 1 :(得分:0)

Qt 4.7是关于性能改进的,所以你应该考虑升级!

Qt 4.6中的光栅绘制引擎(QWS或Windows中的光栅绘制引擎)在QPainter :: drawPolyline()中存在严重的性能问题,其中时间增加超过线性(猜测一些算法O(n * n) )参与了一些积分 - 对于一条600000行的曲线,它会大大打击你。

您的用例最快的选择是Qt4 / X11,因为它是真正的硬件加速。请注意,使用Qt 4.8,您必须手动启用“本机”图形系统(在它是X11上的默认设置之前),并且Qt5 / X11不再加速。

使用C ++时,您可以使用Qwt 6.1,您还可以选择基于OpenGL的画布。我也有一些代码通过离线QGLPixelBuffer呈现像素图,很有可能使它进入Qwt 6.2。