V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
simile
V2EX  ›  2018

Python plot 动态画曲线耗时

  •  1
     
  •   simile · 2018-08-28 11:44:43 +08:00 · 1435 次点击
    这是一个创建于 2040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在在做一个串口波形显示工具,即将串口数据绘制成曲线,动态显示。 整个程序是基于 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 条回复    2018-08-31 17:18:02 +08:00
    simile
        1
    simile  
    OP
       2018-08-31 17:18:02 +08:00
    咋就沉了呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5335 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.