有效更新变量

时间:2012-04-15 17:41:43

标签: python input

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

目前,我一直在使用基本类,通过更新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)

input是一个转换为int的字符串。我最近才开始使用串行连接作为发生器,因此存在一些差异。

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

1 个答案:

答案 0 :(得分: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]