Python plot 动态画曲线耗时

2018-08-28 11:44:43 +08:00
 simile

现在在做一个串口波形显示工具,即将串口数据绘制成曲线,动态显示。 整个程序是基于 tkinter 做的界面,用的是 canvas,然后再用 plot 去画曲线。 大概流程如下: 线程 1、读取串口数据,并将数据发送到消息队列中; 线程 2、从消息队列中读取数据,并画图 经过 debug 发现,无论串口读取数据的速率是多快,最后刷图总是很慢。 请各位大牛指点一下,是不是有其他更优的刷图方式,还是说程序上要做啥特殊处理 部分参考代码如下:

def serial_deal_data(self,data):       
    #print(hex(int(binascii.b2a_hex(data),16)))   
    data_arr=bytearray(data)
    data_np = np.array(data_arr)
    data_np =data_np.reshape(int(len(data_arr)/2),2)
    data_np = data_np[:,0]+data_np[:,1]*256
    #tick=time.clock()
    self.serial_queue.put(data_np)
    #print("2 耗时%16.6f"%(time.clock()-tick))
    #print(data_np)

def serial_show_canvas(self):
    self.tDataReceived = threading.Thread(target=self._show_canvas, args=( ))  
    #threading.Timer(0.0001,self.tDataReceived)
    self.tDataReceived.setDaemon(True)
    self.tDataReceived.start()
          
def _show_canvas(self):         
    while True:  
        if self.serial_queue.empty() == False:
            #tick=time.clock()
            gc.disable()
            data = self.serial_queue.get()
            self.show_canvas(data.tolist())
            #print("耗时%16.6f"%(time.clock()-tick))
            gc.enable()
            
def show_canvas(self,data):
    
    self.y=self.y[:]+data
    for i in range(len(data)):
        self.serial_receive_count+=1
        self.x.append(self.serial_receive_count)
        
    if self.serial_receive_count>100:
        self.ax1.set_xlim([self.serial_receive_count-100, self.serial_receive_count])
     
    self.ax1.plot(self.x,self.y,'r-',label='line1')
    self.canvas.show()
    plt.close()

当 show_canvas 函数为空时,数据的速度可以达到微秒级;如果执行 self.canvas.show(),则时间为 20-200 毫秒之间,并且随时间递增; 如果只有前面的坐标轴处理部分,则时间稳定在 10ms 以内 将 self.ax1.plot(self.x,self.y,'r-',label='line1')和 self.canvas.show() 去掉之后,时间也能达到微秒级的

加入 gc 处理之后,时间达到 100ms 以内。但始终不是量级的变化。

1538 次点击
所在节点   2018
1 条回复
simile
2018-08-31 17:18:02 +08:00
咋就沉了呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/483898

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX