2013-03-13 1 views
1
def thing(mode, data): 
    return [ 
     item for item in data 
     if { 
      'large': lambda item: item > 100, 
      'small': lambda item: item < 100, 
     }[mode](item) 
    ] 

이 목록 내포는 람다 사전을 생성하고 mode 인수를 통해 하나의 람다를 검색하여 현재 처리중인 목록 항목에 적용합니다. 내 질문은 이것입니다 : 이것의 성능 특성은 무엇입니까?목록 이해 중에 파이썬은 어떻게 작동합니까?

listcomp를 반복 할 때마다 전체 사전이 처음부터 생성됩니까? 또는 한 번 생성되어 각 항목에 사용됩니까?

+0

매번 생성됩니다. 또한 각 루프에 2 개의 함수를 생성합니다. – JBernardo

+2

팁 :'import dis; dis.dis (물건)'. – DSM

답변

4

는 listcomp

예를 반복 할 때마다시 처음부터 만든 전체 사전입니다.

또는 한 번 만들어지고 각 항목에 사용됩니까?

호 다행히


는, (내가 생각할 수있는과 같은 모든 다른 사람)이 경우, 그것은 단지 시간 앞서 DICT를 구축하기 쉽습니다 :

d = { 
     'large': lambda item: item > 100, 
     'small': lambda item: item < 100, 
     } 
return [item for item in data if d[mode](item)] 

또는 심지어

func = { 
     'large': lambda item: item > 100, 
     'small': lambda item: item < 100, 
     }[mode] 
return [item for item in data if func(item)] 
+0

@JBernardo -하지만 OP는 예 또는 아니오 질문을했습니다 .-)). 나는 갱신했다. – mgilson

+0

글쎄, 그 멋진 답변입니다. –

2

나는 이것이 전체 dic 목록의 각 요소에 대해 처음부터 다시 작성해야합니다. 다음과 같이 파이썬 지능형리스트의 기본 문법이다

[ E1 for ID in E2 if E3 ]

, E1, E2 및 E3는 표현식

. E2는 통역사가 목록 이해력을 평가하기 시작할 때 한 번 평가됩니다. E1과 E3은 E2가 평가하는 컬렉션의 각 구성원에 대해 평가됩니다. 그래, 네. 귀하의 질문에, 사전은 처음부터 건설하지만 당신은 쉽게 목록을 이해하기 전에 사전을 선언하여 쉽게 수정할 수 있습니다.

1

귀하의 사전 루프 당 한 번 생성하고 사전 캐시보다 두 배 느린에 대한 목록 이해하게된다

>>> %timeit thing1('small', [1, 2, 3, 4, 5, 6]) 
100000 loops, best of 3: 2.4 us per loop 
>>> %timeit thing2('small', [1, 2, 3, 4, 5, 6]) 
1000000 loops, best of 3: 1.06 us per loop 

thing1 원래 기능이었다. thing2은 다음과 같습니다

d = { 
    'large': lambda item: item > 100, 
    'small': lambda item: item < 100, 
} 

def thing3(mode, data): 
    return list(filter(d[mode], data)) 

filter(f, data)item for item in data if f(item)의 약어입니다. Python 3에서는 iterator를 생성하고, 반복자를 반복 할 때만 항목을 걸러냅니다.