为了账号安全,请及时绑定邮箱和手机立即绑定

在python中滚动数组

在python中滚动数组

当年话下 2021-08-17 18:21:13
我目前正在使用 pyserial 和 pyqtgraph 编写一个 python 脚本,该脚本绘制通过串行端口从加速度计传入的数据。我将此数据附加到一个 int 数组并使用它来更新绘图。目前,我的图形宽度是 500(我只显示最近的 500 个元素),我通过将一个元素附加到末尾并从头弹出来“滚动”或“滚动”。data1 = [0] * 500def update():  global curve1, data1, x, ser  if(ser != None): ## serial object. defined via a QPushButton event    line = ser.readline()    csv = line.decode().split(',')    if len(csv) == 2:             data1.append(int(csv[1]))      data1.pop(0)      xdata1 = np.array(data1[-500:], dtype='int')      curve1.setData(xdata1)      x += 1      curve1.setPos(x, 0)      app.processEvents()这个更新方法被 QtTimer 对象调用来更新绘图窗口timer = QtCore.QTimer()timer.timeout.connect(update)timer.start(0)这样我就避免了一个不断增长的数组,也避免了通过向左移动元素来复制值。然而,我的情节不一致并且偶尔会滞后(当我移动传感器时,情节会在几秒钟后做出反应)。这是因为我的数据滚动效率低吗?
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

要进行 O(1) 更新过程,您可以使用双数组缓冲区自行完成:


size=4

buffersize=2*size

buffer=np.zeros(buffersize+1,int) # one more room  for keep trace on beginning of buffer.

sensor=iter(range(1,10**5)) # emulation


def update():

    i=buffer[buffersize] # to avoid global variable i

    buffer[i]=buffer[i+size]=next(sensor) # double copy.

    buffer[buffersize]=i=(i+1)%size

    print(i,buffer[:buffersize],buffer[i:i+size])

    # In real life : curve1.SetData(buffer[i:i+size])

由于buffer[i:i+size]只是一个视图,因此不会花时间更新curve1。


跑步 :


>>> for k in range(6): update()


1 [1 0 0 0 1 0 0 0] [0 0 0 1]

2 [1 2 0 0 1 2 0 0] [0 0 1 2]

3 [1 2 3 0 1 2 3 0] [0 1 2 3]

0 [1 2 3 4 1 2 3 4] [1 2 3 4]

1 [5 2 3 4 5 2 3 4] [2 3 4 5]

2 [5 6 3 4 5 6 3 4] [3 4 5 6]

....


查看完整回答
反对 回复 2021-08-17
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

这是这种 FIFO 功能的一个很好的参考:Python 中的队列

从该链接总结:

考虑使用collections.deque这种行为,因为列表很慢。


查看完整回答
反对 回复 2021-08-17
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信