4

センサーから読み取ったデータの 3 つの更新曲線をプロットする必要があります。曲線のみを使用する場合、プロットの更新は非常に高速ですが、それらすべてをプロットしようとすると、大幅に遅くなります。私が使用するコードは次のとおりです。

#!/usr/bin/python


from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

import time
import numpy as np


app = QtGui.QApplication([])



win = pg.GraphicsWindow()

p1 = win.addPlot()
p2 = win.addPlot()
p3 = win.addPlot()


curve1 = p1.plot()

curve2 = p2.plot()

curve3 = p3.plot()

readData = [0.0, 0.0, 0.0]
y1=[0.0]
y2=[0.0]
y3=[0.0]

temp = [0.0]

start = time.time()

def update():
    global curve1, curve2, curve3
    t = time.time()-start         # measure of time as x-coordinate
    readData= readfun()        #function that reads data from the sensor it returns a list of 3 elements as the y-coordinates for the updating plots
    y1.append(readData[0])
    y2.append(readData[1])
    y3.append(readData[2])
    temp.append(t)

    curve1.setData(temp,y1)
    curve2.setData(temp,y2)
    curve3.setData(temp,y3)
    app.processEvents()



timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)




if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_'):
        QtGui.QApplication.instance().exec_()

3 つの曲線のプロットの更新を高速化するにはどうすればよいですか? ありがとう

編集: dirkjot のソリューションに触発されて、誰かが同じ目的で必要になる場合に備えて、上記のコードを編集したいと思います。それはうまくいきます:

#!/usr/bin/python


from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg

import time
import numpy as np


app = QtGui.QApplication([])

win = pg.GraphicsWindow()

p1 = win.addPlot()
p2 = win.addPlot()
p3 = win.addPlot()


curve1 = p1.plot()

curve2 = p2.plot()

curve3 = p3.plot()

readData = [0.0, 0.0, 0.0]
y1=np.zeros(1000,dtype=float)
y2=np.zeros(1000,dtype=float)
y3=np.zeros(1000,dtype=float)

indx = 0
def update():
    global curve1, curve2, curve3, indx, y1,y2,y3

    readData= readfun()        #function that reads data from the sensor it returns a list of 3 elements as the y-coordinates for the updating plots
    y1[indx]=readData[0]
    y2[indx]=readData[1]
    y3[indx]=readData[2]

    if indx==99:
       y1=np.zeros(1000,dtype=float)
       y2=np.zeros(1000,dtype=float)
       y3=np.zeros(1000,dtype=float)
    else:
       indx+=1
    curve1.setData(y1)
    curve2.setData(y2)
    curve3.setData(y3)
    app.processEvents()



timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)




if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_'):
        QtGui.QApplication.instance().exec_()
4

1 に答える 1

7

1 つの問題は、リストに追加していることです。これは、リストが大きくなると非常に遅くなります。Python は完全なリストを以前の場所よりも 1 セル大きい新しい場所にコピーする必要があるためです。追加を削除してコードを再度実行することでこれをテストできますが、データの読み取りは続けます (そのテストのために破棄します)。

それが問題である場合は、いくつかの解決策があります。

  1. 大きなリスト (たとえば[None] * 1000) を事前に割り当て、書き込み先にカウンターを保持します。1kに達したら折り返します。このようにして、昔ながらのスコープで見られるような継続的な更新表示が得られます。
  2. numpy を使用して、たとえば 1k サンプルの固定バッファーを事前に割り当てます。サンプルを最後に追加します (位置 -10 から -1)。-1 に達したら、効率的な numpy データ ステートメント ( のようなものですbuffer[0:-10] = buffer[10:]が、専用の numpy シフト命令がある場合があります) でバッファーの内容を 10 左に移動し、-10 で再び書き込みを開始します。
于 2014-12-19T14:07:51.067 に答える