0

我正在记录来自串行连接的输入。

目前,我一直在使用输入通过更新运行的基本类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 的字符串。我最近才开始使用串行连接作为生成器,因此存在一些差异。

然后使用最小值和最大值来计算用于读取二进制数据的激光强度。

4

1 回答 1

0

当您输入数据时,我会在这里进行二等分以保持顺序。这样最小/最大值的查找将是 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]
于 2012-04-15T18:25:29.267 回答