2012-04-15 15 views
0

シリアル接続からの入力を記録しています。変数の効率的な更新

瞬間、私は入力がself.min & self.max

の更新を介して実行される基本的なクラスを使用しているしかし、おそらくこれを行うには、より効率的な方法はありますか?

おそらく両端キュー?これには効率のメリットがありますか? おそらくクラスは必要ありませんか?


私が使用している1の例:

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に変換される文字列です。私は最近、シリアル接続をジェネレータとして使用し始めたので、いくつかの相違があります。

次に、minとmaxを使用して、バイナリデータを読み取るためのlazerの強度を計算します。

+0

入力の形式と目的を説明します。また、あなたはこれまでのことを私たちに見せてもらえますか? –

+0

@PlatinumAzure - どのようなアイデアですか? – beoliver

答えて

0

ここでは、データを入力するときに順序を維持するために二等分します。したがって、min/maxのルックアップは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] 
+0

入力が定数(たとえば1000秒/秒)の場合、最大長の両端キューは同じになりますか?明らかに私はリストを100,000アイテム長くしたくありません:) – beoliver

関連する問題