セットの理解を初期化

David542:

ここで設定した理解の例です。

inp    = [1,2,3,4,4,3,5]
s_comp = {element for element in inp}
# {1, 2, 3, 4, 5}

Pythonのノウハウが即時セットの理解に下方変換することはない(?初期リストをスキップ)、またはこれが最初のリスト内包を行い、その後、他の言葉で(セットに結果のリストを変換しない、それはこれを使用して、リソースの無駄ですセットを作成するための表記法)。

s_comp = set([element for element in inp])
# {1, 2, 3, 4, 5}

以下からの注意、cProfileそれは最初に、後者のためにリストの内包を行うように思えます。それらのそれぞれは、ステップの同じ量を持っていますが(私は最初のものは一歩少ないを持っている必要があり想像するでしょうか?)。

>>> cProfile.run('{element for element in [1,2,3,4,4,3,5]}')
         4 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 <string>:1(<setcomp>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}

>>> cProfile.run('set([element for element in [1,2,3,4,4,3,5]])')
         4 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<listcomp>) # list not set
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}


ガブリエル帽子:

あなたは反復可能を持っている場合は、リストの内包表記を使用してリソースの無駄である[]代わりに、直接集合理解の{}

あなたは以下のFUNC Aのバイトコードを見れば、あなたはPythonがリストを構築し、パラメータセットに()関数としてそれを渡していることがわかります。

Func BのPythonのバイトコードで直接設定を構築するために最適化されています。

私は分析を行うには、次のコードを使用しています。

from dis import dis

def a():
    return set([x for x in range(1, 10)])

def b():
    return {x for x in range(1, 10)}

print('Dis Func A\n')
print(dis(a))
print('Dis Func B\n')
print(dis(b))

DISのFunc A

  5           0 LOAD_GLOBAL              0 (set)
              2 LOAD_CONST               1 (<code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>)
              4 LOAD_CONST               2 ('a.<locals>.<listcomp>')
              6 MAKE_FUNCTION            0
              8 LOAD_GLOBAL              1 (range)
             10 LOAD_CONST               3 (1)
             12 LOAD_CONST               4 (10)
             14 CALL_FUNCTION            2
             16 GET_ITER
             18 CALL_FUNCTION            1
             20 CALL_FUNCTION            1
             22 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x00000249F64B2EA0, file "c:\Projects\stack-overflow\asd.py", line 5>:
  5           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_FAST                1 (x)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

DISのFunc B

  9           0 LOAD_CONST               1 (<code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>)
              2 LOAD_CONST               2 ('b.<locals>.<setcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_GLOBAL              0 (range)
              8 LOAD_CONST               3 (1)
             10 LOAD_CONST               4 (10)
             12 CALL_FUNCTION            2
             14 GET_ITER
             16 CALL_FUNCTION            1
             18 RETURN_VALUE

Disassembly of <code object <setcomp> at 0x00000249F64CE030, file "c:\Projects\stack-overflow\asd.py", line 9>:
  9           0 BUILD_SET                0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (x)
              8 LOAD_FAST                1 (x)
             10 SET_ADD                  2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=15180&siteId=1