2016-11-25 9 views
-1

私のコンピュータにmemoizationコードをテストしています。私は100000の範囲の配列を持っています。次のコードを使用します。メモ化技術の使用メモリとスピードの点でより高価です。Pythonのリストまたは辞書

def fact1(n): 
    if n<1: 
     return 1 
    else: 
     fa=1 
     for i in range(1, n+1): 
      fa*=i 
     return fa 

、次のコードは、コードの私の理解、最適化されたメモリが低速で走行を開始かかわらず、メモ化から

memolookuptable={1:1, 2:2} 
    def fact2(n): 
     if n not in memoookuptable.keys(): 
      for i in range(3,n+1): 
       if i not in memoookuptable.keys(): 
        memolookuptable[i]=i*memolookuptable[i-1] 

、だろう。計算値を保存して再計算を避けるようにメモ帳を正しく理解していますか?それが正しい場合、計算された値がすぐに利用できるという事実にもかかわらず、より大きな計算が遅くなるのはなぜですか?

memoizationを使用してメモリとスピードを最適化する最良の方法はどれですか?

+1

短い答え:リストはdictsより少ないRAMを使用し、展開が必要な場合は高速で、インデックスを知っていればリストの検索はdictの検索よりも高速です。しかし、アイテムのリストを検索する必要がある場合、そのキーを知っている場合は、dictアイテムに直接アクセスするよりもはるかに時間がかかります。また、リスト内のすべてのスロットを使用しない場合、dictは_less_ RAMを使用できます。 –

+0

申し訳ありません、私はmemo.keys()を書きました。私はコードを書いた後でそれを実現しました。ありがとう!私の悪い。 –

答えて

1

.keys()に電話する必要はありません。単にif n not in memolookuptable:を使用してください。私はそれがハッシュを使用するので、より速くなければならないと信じています。 .keys()は、ルックアップが遅いリストを返します。

+1

'.keys()'はPython 2でリストを返しますが、Python 3では動的[Dictionary view object](https://docs.python.org/3/library/stdtypes.html#dictionary-view-オブジェクト)が、すべてのループ反復で新しいものを作成するのは非常に非効率的です。 –

+1

興味深い。私は2対3のどちらかを調べることを覚えてみるか、それは私の答えにPython 2のためであることに注意してください。 – Lolgast

関連する問題