Я использую PyQtGraph для быстрой визуализации сбора данных. Для этого я постоянно перерисовываю данные, используя цикл while
. Упрощенная версия этого кода дается:
import time
import numpy
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
x = numpy.linspace(-2 * numpy.pi, 2 * numpy.pi, 1000)
y = numpy.cos(x)
# Plot
win = pg.GraphicsWindow()
win.resize(800, 800)
p = win.addPlot()
p.plot(x, y, pen = "y")
i = 0
while i < 5000:
start_time = time.time()
noise = numpy.random.normal(0, 1, len(y))
y_new = y + noise
p.plot(x, y_new, pen = "y", clear = True)
p.enableAutoRange("xy", False)
pg.QtGui.QApplication.processEvents()
i += 1
end_time = time.time()
print("It has been {0} seconds since the loop started".format(end_time - start_time))
win.close()
Когда я измеряю каждую итерацию, я обнаруживаю, что неправильно очищаю график. Время итерации продолжает увеличиваться, и я замедляю сбор данных. В приведенном выше примере время итерации в начале составляет около 0.009 s
, а в конце — около 0.04 s
. Поэтому у меня утечка памяти.
Я знаю, что в matplotlib
мне следует звонить в clf()
, чтобы как следует очистить сюжет. К сожалению, я не так хорошо знаком с PyQtGraph и думал, что clear = True
позаботится об этой проблеме. Я уверен, что это должно быть возможно, поскольку PyQtGraph
был разработан для такого типа использования.
Как очищать график на каждой итерации, чтобы не замедлять сбор данных?