创建一个引用计数的数字

She*_*hep 24 python memory-management matplotlib

似乎在matplotlib中创建一个图形的标准方法并不像我在python中所期望的那样:默认情况下fig = matplotlib.figure(),在循环中调用将保留所有创建的数字,并最终耗尽内存.

相当 ,其处理的解决方法职位,但需要显式调用matplotlib.pyplot.close(fig)似乎有点hackish.我想要的是一个简单的方法来fig计算引用,所以我不必担心内存泄漏.有办法做到这一点吗?

Joe*_*ton 26

如果您在不使用的情况下创建图形plt.figure,则应按照您的预期对其进行引用计数.例如(这也是使用非交互式Agg后端.)

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

# The pylab figure manager will be bypassed in this instance.
# This means that `fig` will be garbage collected as you'd expect.
fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
Run Code Online (Sandbox Code Playgroud)

  • 有点疯狂,Matplotlib _still_假设使用非垃圾收集`pylab`图形管理器......好吧,**一切.**虽然上述方法足以满足开发时已知的单个静态后端的狭窄情况,目前还不清楚这是如何扩展到在解释时选择的任意动态后端的一般情况._Aaaany-way._ Matplotlib.只是"呃!",有时候. (6认同)
  • 没有`FigureCanvas(图)`当我试图保存数字时,我得到一个例外.我认为`Figure`必须总是用`FigureCanvas`绘制? (3认同)
  • 是的!否则就无法绘制任何内容(艺术家已创建,但在您保存/显示绘图之前不会进行绘图).这是API的一个瑕疵; 理想情况下,画布将与图形一起启动.如果你使用`canvas.print_figure(filename)`而不是`fig.savefig(filename)`(实际上是`fig.savefig`在幕后做的话)可能会更有意义.这纯粹是为了您自己的理解(画布是处理绘图/保存的后端特定部分).最终结果是一样的. (2认同)

1''*_*1'' 7

如果您只想保存数字而不是显示它们,您可以使用:

def savefig(*args, **kwargs):
    plt.savefig(*args, **kwargs)
    plt.close(plt.gcf())
Run Code Online (Sandbox Code Playgroud)

这可以说是不那么hacky,但无论如何。