2016-08-28 13 views
0

私の質問は、質問hereとは異なります。主に、辞書を含むコードの改善点を尋ねています。しかし、このリンクでは、私の次のステップになるメモリプロファイラについて説明しています。Pythonで辞書を最適化する

同じことを達成するために、次の2つのコードセットがあります。

まず1、

a={1: 'a', 2: 'b', 3: 'c', 4: 'd'} 
b=[x for x in a if x in (1,2,3)] 
b=['a', 'b', 'c'] 

2つ目、

a={1: 'a', 2: 'b', 3: 'c', 4: 'd'} 
c=[a[x] for x in set(a.keys()) & set([1,2,3])] 
b=['a', 'b', 'c'] 

私は1つのメモリの最適化方法の面でより良い働く知っていただきたいと思いますし、大量のデータセットのために。

ありがとうございます!

+0

可能な複製(http://stackoverflow.com/questions/110259/which-python-memory -profiler-is-recommended) –

+1

どちらもメモリ最適化の面でかなり悪いです。 Dictsはキーアクセス時の速度が特に速く、サブスクリプティングを使用して最速(かつ最も単純な)方法を避けています。私たちはいくつのキーを話していますか?あなたの例題を実行する最も速い方法は、 '' [a [1]、a [2]、a [3] 'または' [a [x] for(1、2、3)] ' –

+2

'[x in a(x、1、2、3)in a x] 'が両方より高速です。 '(1,2,3)'が本当に大きければ、それを 'frozenset'としてあらかじめ計算し、' the_set.intersection(a) 'だけを実行することができます。 – Blender

答えて

1

あなたはメモリを使用するために最適化している場合は、多くの場合、良いツールです。たとえば、次のようにあなたの例では

def get_keys(mapping, keys): 
    for key in keys: 
     try: 
      yield mapping[key] 
     except KeyError: 
      continue 

:[?Pythonのメモリプロファイラをお勧めします]の

list(get_keys(a, (1, 2, 3))) 
['a', 'b', 'c'] 
+0

なぜ 'dict.get'の代わりに' 'マッピングのキー:return mapping [key]'? – Blender

+0

@Blenderえー、私は何か他のものと一緒に遊んで始めて、それをひどく改造したからです。とにかくおそらく高速である 'try/except'を使うように編集しました。 –

0

これらの2つの中から尋ねたい場合は、2番目の方が良いです。しかし、全体的に、どちらの方法も改善できる可能性があります。似たようなことをしなければならない場合、私はやったでしょう:

>>> a = {1: 'a', 2: 'b', 3: 'c', 4: 'd'} 
>>> [a[i] for i in (1,2,3) if i in a] 
['a', 'b', 'c']