我需要使用 pyqtgraph 绘制连续输入,因此我使用循环缓冲区来保存数据。我使用 deque 和 maxlen 来完成这项工作。 (Python 2.7、numpy 1.9.2、pyqtgraph 0.9.10)
from collections import deque
def create_cbuffer(self):
buffer_len = self.BUFFER_LEN*self.number_of_points
data = [0]*buffer_len # buffer_len = 160k
self.cbuffer[0] = deque(data, maxlen=buffer_len)
buffer_len = self.BUFFER_LEN
data = [0]*buffer_len
self.cbuffer[1] = deque(data, maxlen=buffer_len)
之后我像这样使用它:
import time
def update_cbuffer(self):
data_points, data = data_feeds() # data get every 16ms as lists
start_t = time.time()
self.cbuffer[0].extend(data_points) # Thanks to @PadraicCunningham
# for k in xrange(0, self.number_of_points):
# self.cbuffer[0].append(data_points[k])
self.cbuffer[1].append(data)
fin_t = time.time() - start_t
设置图为:
self.curve[0] = self.plots[0].plot(self.X_AXIS,
[0]*self.BUFFER_LEN*self.number_of_points,
pen=pg.intColor(color_idx_0),name='plot1')
self.curve[1] = self.plots[1].plot(self.X_AXIS_2, [0]*self.BUFFER_LEN,
pen=pg.intColor(color_idx_1),name='plot2')
将绘图更新为:
def update_plots(self):
self.curve[0].setData(self.X_AXIS, self.cbuffer[0])
self.curve[0].setPos(self.ptr, 0)
self.curve[1].setData(self.X_AXIS_2, self.cbuffer[1])
self.curve[1].setPos(self.ptr, 0)
self.ptr += 0.016
然后我使用 QTimer 调用它:
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.update_cbuffer)
self.timer.timeout.connect(self.update_plots)
self.timer.start(16)
问题是:
1.当我绘制它时,它似乎比16ms慢得多。有什么想法可以加快速度吗?
2.当我使用 time.time() 对 update_plots() 进行计时并计算其平均运行时间(total_time/number_of_runs)时,它逐渐增加,我试图理解其背后的原因。
有什么建议么?我是Python新手,代码中可能会犯一些错误,请毫不犹豫地指出。提前谢谢你的帮助。
p.s我已经按照建议尝试了不同的循环缓冲区高效的循环缓冲区?
class Circular_Buffer():
def __init__(self, buffer_len, data_type='float'):
if data_type == 'int':
self.__buffer = np.zeros(buffer_len, dtype=int)
else:
self.__buffer = np.zeros(buffer_len)
self.__counter = 0
def append(self, data):
self.__buffer = np.roll(self.__buffer, -1)
self.__buffer[-1] = data
def get(self):
return self.__buffer
但事实证明速度要慢得多my case.
我也尝试过这个:
class CB_list():
def __init__(self, buffer_len):
self.__buffer = [0]*buffer_len
def append(self, data):
self.__buffer = self.__buffer[1:]
self.__buffer.append(data)
def get(self):
return self.__buffer
它的性能与双端队列相似,所以我坚持使用双端队列。
编辑:
抱歉,我昨天犯了一个错误。我已经在代码上更正了它。
data = [0]*buffer_len # buffer_len = 16k <--- Should be 160k instead