как сделать график в реальном времени на основе pyqtgraph быстрее

Я реализую приложение для отображения ЭКГ на основе pyqtgraph.

Он обновляет 24 подграфика в сетке. Каждый подграфик имеет 4 канала ЭКГ, и каждый канал имеет соответствующий размер буфера 2500 целых чисел.

Выделенный поток UDP извлекает данные из сети и записывает в очереди Python, а очереди считываются функциями, которые периодически вызываются QTimer. Некоторые соответствующие фрагменты кода:

win = pg.GraphicsWindow()

#Create the GRID using the constructor and win.nextRow
for x in range(0, (config_data.num_of_devices / config_data.gridwidth)):
    for y in range(0, config_data.gridwidth):
        devicenum = (config_data.gridwidth * x) + y
        devicehandle[devicenum] = Deviceplot(
            devicenum, tpen, dataq[devicenum], win, config_data)
    win.nextRow()


class Deviceplot(object):

    def __init__(self, device, tpen, dataqueue, win, config_data):
        self.p = win.addPlot()
        self.curve1 = self.p.plot(self.data1, pen=self.tpen)

def update():
    for x in range(0, config_data.num_of_devices):
        devicehandle[x].getdata()
        devicehandle[x].update1()
        devicehandle[x].update2()
        devicehandle[x].update3()
        devicehandle[x].update4()

timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(100)  

Таймер должен срабатывать каждые 100 мс. Но периодичность таймера составляет более 100 мс, когда я проверял. Следовательно, сюжеты кажутся медленнее. Время обработки функций обновления составляет менее 100 мс. Люк из группы Google pyqtgraph говорит, что дополнительное время уходит на перерисовку графического интерфейса.

Я включил обработчик кликов, который максимизировал один график и скрывал все остальные графики. Теперь таймер срабатывает правильно. я предполагаю, что Qt требуется меньше времени для перерисовки одного графика, даже если он максимизирован (возможно, из-за меньшего изменения уровня пикселей).

Итак, мой вопрос в том, как я могу оптимизировать или улучшить свой код, чтобы при просмотре всех графиков вместе в виде сетки график обновлялся правильно. Как сократить время перекраски? Или есть лучшее решение?

ОБНОВИТЬ

Я профилировал свой код, и вы можете просмотреть его на этой странице pastebin.

Я попробовал «отключить AutoRange». Но все же это не удовлетворительно.


person kiran    schedule 07.02.2015    source источник
comment
Первый шаг — профилирование вашего кода. См. stackoverflow.com/questions/17103698/   -  person Luke    schedule 07.02.2015
comment
@ Люк. Прямо сейчас мы вызываем setData для каждого графика в цикле. Я думаю, что это вызовет перекраску один за другим. Могу ли я отключить эту перерисовку для каждого графика, а затем, после вызова setData для всех графиков, вручную запустить перерисовку виджета, который инкапсулирует подграфики? Возможно, это сократит время перерисовки.   -  person kiran    schedule 09.02.2015
comment
Нет, Qt позаботится об ограничении усилий, затрачиваемых на перерисовку. Не пытайтесь угадать, просто профилируйте свой код :)   -  person Luke    schedule 09.02.2015
comment
@ Люк. Уже профилирован. Не могли бы вы проверить pastebin.com/KPbPkPwr и дайте мне знать, если у вас есть какие-либо предложения   -  person kiran    schedule 10.02.2015
comment
Извините, я пропустил обновление. Я не вижу очевидной возможности для оптимизации, но в этом случае может быть полезнее график вызовов (например, stackoverflow.com/questions/4544784/). Я также мог бы дать больше советов, если вы опубликуете рабочий пример (используйте случайные данные).   -  person Luke    schedule 11.02.2015