2013-12-10 5 views
12

Q1 - 次は、generator expressionまたはset comprehensionset()ですか? (それとも、そうであれば、同じですlist & dict内包表記も対応型キャスト発電機に?)python Set Comprehensionsはどのように機能しますか?

my_set = {x for x in range(10)} 

Q2 - 評価が重複した値が&、その後set()を適用することによって、それらを削除を検討していますか?

dup_set = {x for x in [0, 1, 2, 0, 1, 2]} 

理解度は、通常のforループよりも(スピードワイズ)優れていますか?

更新 - 速度比較のためにtimeitを試してみました。私がいるかどうかわからないちょうどそれについて(公平)。

C:\>python -m timeit "s = set()" "for x in range(10):" " 
    s.add(x)" 
100000 loops, best of 3: 2.3 usec per loop 

C:\>python -m timeit "s = {x for x in range(10)}" 
1000000 loops, best of 3: 1.68 usec per loop 

さて、そこで、いくつかの条件文

C:\>python -m timeit "s = set()" "for x in range(10):" " 
    if x%2: s.add(x)" 
100000 loops, best of 3: 2.27 usec per loop 

C:\>python -m timeit "s = {x for x in range(10) if x%2}" 
1000000 loops, best of 3: 1.83 usec per loop 

を使用して、かなりの差がある、それが原因cにハードコードされている機能にありますか?

+1

timeit(http://docs.python.org/2/library/timeit.html)を使用するか、timeモジュールでコードのタイミング機能を構築して、時間/速度の相違点を確認することができます – Totem

答えて

7

1:はい、はい、はいとはい。あるいは、少なくとも彼らはこのように行動します。あなたがバイトコードを見ているならば、少し違っています。解体にこのコード(Pythonの2.7)してみましょう:

def list_comp(l): 
    return [x+1 for x in l] 

def dict_comp(l): 
    return {x+1:0 for x in l} 

def set_comp(l): 
    return {x+1 for x in l} 

def generator(l): 
    return (x+1 for x in l) 

をこれはあなたが得るものです:

Disassembly of list_comp: 
    2   0 BUILD_LIST    0 
       3 LOAD_FAST    0 (l) 
       6 GET_ITER    
     >> 7 FOR_ITER    16 (to 26) 
      10 STORE_FAST    1 (x) 
      13 LOAD_FAST    1 (x) 
      16 LOAD_CONST    1 (1) 
      19 BINARY_ADD   
      20 LIST_APPEND    2 
      23 JUMP_ABSOLUTE   7 
     >> 26 RETURN_VALUE 
Disassembly of dict_comp: 
    5   0 LOAD_CONST    1 (<code object <dictcomp> at 029DEE30) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE 
Disassembly of set_comp: 
    8   0 LOAD_CONST    1 (<code object <setcomp> at 029DECC8) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE 
Disassembly of generator: 
11   0 LOAD_CONST    1 (<code object <genexpr> at 02A8FD58) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE      

バイトコードは、辞書のcomprenhension、セットの理解とジェネレータのほとんど同じです。それらはすべてコードオブジェクト(<dictcomp><setcomp>または<genexpr>)をロードし、呼び出し可能な関数を呼び出します。あなたのリストの理解に対応するバイトコードを生成するので、リストの理解は異なります。今回はそれが解釈されているため、ネイティブではありません。

Q2:あなたが指定したリストを理解するため、実際に重複する値は考慮されません。そして、それは理解を持ってセットを作ります。

タイミングについて:リスト/ディクテーション/セットの理解は、他のどのものよりも速くなる傾向があります。たとえそれが解釈されても、生成されるバイトコードは、SET_ADD,LIST_APPENDまたはMAP_ADDのような特別なバイトコード命令を使用して、ほとんどの場合最適化されます。

+0

は 'C '?? –

+0

私は確信が持てません。私はそれを確認します。 – Vincent

+3

明らかに、それはあなたが使っているPython(CPython、IronPython、Jython、PyPyなど)によって異なります。しかし、重要な点は、それが何らかの理由で、すなわちインタセプトされていないことである。 –

関連する問題