在Spyder中复用绘图以避免循环绘图内存不足
解决Spyder中重复绘图内存耗尽的问题
你的问题核心是每次调用plt.plot()都会创建新的线条对象,堆积后占用大量内存。可以通过两种高效方式解决:
方式一:复用同一个线条对象
初始化时创建一条空线条,之后每次迭代只更新它的数据,而非新建线条,这是最省内存的方案:
import numpy as np import matplotlib.pyplot as plt import random as rn arr = np.zeros(100) plt.axis([1, 100, 1, 100]) # 初始化空线条,获取线条对象(注意逗号,plt.plot返回的是列表) line, = plt.plot(arr) for iterations in range(10): for n in range(100): arr[n] = rn.randrange(0, 99) # 仅更新线条的y轴数据,不新建对象 line.set_ydata(arr) plt.pause(0.0001)
方式二:每次绘制前清除当前轴内容
如果需要保留动态绘制的视觉逻辑,可在每次绘图前清除坐标轴内的旧内容,避免旧线条堆积:
import numpy as np import matplotlib.pyplot as plt import random as rn arr = np.zeros(100) plt.axis([1, 100, 1, 100]) for iterations in range(10): for n in range(100): arr[n] = rn.randrange(0, 99) # 清除当前坐标轴的所有内容 plt.cla() # 重新设置坐标轴范围,避免cla()后范围自动变化 plt.axis([1, 100, 1, 100]) plt.plot(arr) plt.pause(0.0001)
额外优化建议
- 绝对避免在循环内频繁调用
plt.plot(),这是内存泄漏的核心原因 - 在Spyder的IPython控制台中,确保绘图后端设置为
inline或automatic,减少独立绘图窗口的创建 - 针对超大规模迭代场景,若复用线条仍有内存压力,可定期调用
plt.close()关闭闲置的绘图窗口
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

