V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
simile
V2EX  ›  2018

Python plot 动态画曲线耗时

  •  1
     
  •   simile · Aug 28, 2018 · 2040 views
    This topic created in 2802 days ago, the information mentioned may be changed or developed.

    现在在做一个串口波形显示工具,即将串口数据绘制成曲线,动态显示。 整个程序是基于 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 以内。但始终不是量级的变化。

    1 replies    2018-08-31 17:18:02 +08:00
    simile
        1
    simile  
    OP
       Aug 31, 2018
    咋就沉了呢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2398 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:47 · PVG 09:47 · LAX 18:47 · JFK 21:47
    ♥ Do have faith in what you're doing.