2013-12-10 2 views
12

Q1 - 다음은 generator expression 또는 set comprehensionset()입니까? (아니면 그렇게하면, 동일하다 list & dict 함축 또한 해당 유형 캐스트 ​​발전기에?)python Set Comprehensions은 어떻게 작동합니까?

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

Q2 - 평가는 중복 값이 ​​& 다음 set()을 적용하여 제거 고려합니까?

일반용 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)을 사용하거나 시간 모듈과 함께 코드 타이밍 기능을 빌드하여 시간/속도 차이점을 알아낼 수 있습니다. – Totem

답변

7

1 : 예, 예, 예 및 예. 또는 적어도 그들은 이처럼 행동합니다. 바이트 코드를 살펴 본다면 조금 다릅니다. 의는 (파이썬 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      

바이트 코드 간신히 DICT의 comprenhension, 설정 이해와 발전기에 대해 동일합니다. 그들은 모두 코드 객체 (<dictcomp>, <setcomp> 또는 <genexpr>)를로드 한 다음 호출 가능 함수를 생성합니다. 목록 이해는 해당 목록 이해에 해당하는 바이트 코드를 생성하기 때문에 다릅니다. 이번에는 해석 되었기 때문에 원주민이 아닙니다.

질문 2 : 당신이 준 목록과 이해력을 생성하기 때문에 중복 값을 고려하지 않습니다. 그리고 나서 그것은 집합으로 이해력을 만듭니다.

타이밍 : 목록/Dict/Set 포함은 다른 어떤 것보다 빠르다. 심지어 해석 되더라도, 생성 된 바이트 코드는 SET_ADD, LIST_APPEND 또는 MAP_ADD과 같은 특수 바이트 코드 명령어로 대부분의 경우 최적화됩니다.

+0

은'C '?? –

+0

잘 모르겠습니다. 확인하겠습니다. – Vincent

+3

필자가 작성한 내용은 사용중인 파이썬 (CPython, IronPython, Jython, PyPy 등)에 따라 다릅니다. 그러나 중요한 점은 그것이 보편적이지 못하다는 것이다. –

관련 문제