Matplotlib中_invalidate_internal执行时间线性增长原因及解决方案咨询
_invalidate_internal 功能说明与优化方案
函数核心功能
_invalidate_internal 是Matplotlib变换系统的底层通知函数,所有坐标变换关联对象(包括线条、坐标轴、刻度、图形元素)的属性发生变化时,都会触发该函数向上下游关联的变换节点传递失效标记,通知所有绑定的对象需要重新计算坐标映射关系。
该函数执行时长持续增长的核心原因是:每次重绘时需要遍历的关联变换节点数量持续增加,本质是绘图对象堆积导致的变换链无限变长。
针对你的场景的优化措施
你当前代码的核心问题是 make_plot() 方法大概率是每次更新数据时都重新调用 plot() 生成新的线条对象,没有复用已有对象,导致axes上的历史线条越来越多,每个线条都绑定独立的变换节点,最终推高了 _invalidate_internal 的遍历耗时,内存溢出后程序无报错崩溃。可按以下步骤修复:
- 复用绘图对象:初始化阶段为每个动态图生成一次Line2D对象并存储,例如:
数据更新时直接修改已有线条的数据,不要重复调用# 初始化阶段执行一次即可 current_plot.line, = current_plot.ax.plot([], [], color=current_plot.plot_color)plot()方法:current_plot.line.set_xdata(time_stream) current_plot.line.set_ydata(data_stream) - 局部重绘代替全局重绘:更新数据后不要触发整个画布重绘,仅重绘变化的线条,结合blit模式减少无效计算:
# 仅重绘变化的线条 current_plot.ax.draw_artist(current_plot.line) current_plot.canvas.blit(current_plot.ax.bbox) - 减少属性变更触发的失效通知:仅在颜色确实需要变更时再修改线条颜色,不要每次更新数据都重复赋值颜色属性;固定x轴显示范围,避免每次数据更新都触发坐标轴自动缩放导致的变换失效。
- 定期检查冗余对象:可临时加日志输出
len(current_plot.ax.lines),如果该数值持续增长,说明存在绘图对象堆积,需要在新建对象前先调用old_line.remove()清理旧对象。
内容的提问来源于stack exchange,提问作者b_cat64
相关产品推荐
相关产品推荐

