我正在记录来自串行连接的输入。
目前,我一直在使用一个基本类,输入是通过更新self.min & self.max
运行的
但也许有更有效的方法可以做到这一点?
也许是德克? 这会有效率优势吗?也许不需要上课?
我使用过的一个例子:
class RangeFinder(object):
def __init__(self, _mem=3) :
self._mem = deque(maxlen=_mem)
self.absmax = -10**10
self.absmin = 10**10
self.relmax = None
self.relmin = None
def read(self, _data) :
if _data != None:
self._mem.append(_data)
if len(self._mem) == self._mem.maxlen :
self.relmax = max(self._mem)
self.absmax = max(self.absmax, self.relmax)
self.relmin = min(self._mem)
self.absmin = min(self.absmin, self.relmin)
另一个想法:
class MinMax(deque):
def __init__(self):
deque.__init__(self, [ 10**10, -10**10 ], maxlen=2)
def read(self, _data):
if _data < self[0]:
self.popleft()
self.appendleft(_data)
if _data > self[1]:
self.pop()
self.append(_data)
输入是转换为 int 的字符串。我最近才开始使用串行连接作为生成器,因此存在一些差异。
然后使用最小值和最大值来计算用于读取二进制数据的激光器的强度。
我会在这里进行平分法以保持输入数据时的顺序。因此,最小值/最大值的查找将为 O(1),并且加载将在插入时进行 (O(nlogn))。另外,我认为您在这里不需要类,您可以安全地仅实现函数(如果问题如您所描述的那样)。
>>> import random
>>> import bisect
>>> data = []
>>> input_data = random.sample(range(1000),100)
>>> #Substitute this with your serial input data
>>> for i in input_data:
... bisect.insort(data, i)
>>> min = data[0]
>>> max = data[-1]