2013-03-14 2 views

답변

60
tup = tuple((element.foo, element.bar) for element in alist) 

기술적으로 동등하다. 그것은 목록 이해력과 같지만 느리게 평가되고 중간 목록에 메모리를 할당 할 필요가 없습니다.

완성도를 들어, 지능형리스트는 다음과 같이 보일 것이다 :

tup = tuple([(element.foo, element.bar) for element in alist]) 

 

PS : attrgetter하지 빠르다 (alist 여기 만 항목이) :

In [37]: %timeit tuple([(element.foo, element.bar) for element in alist]) 
1 loops, best of 3: 165 ms per loop 

In [38]: %timeit tuple((element.foo, element.bar) for element in alist) 
10 loops, best of 3: 155 ms per loop 

In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist)) 
1 loops, best of 3: 283 ms per loop 

In [40]: getter = operator.attrgetter('foo','bar') 

In [41]: %timeit tuple(map(getter, alist)) 
1 loops, best of 3: 284 ms per loop 

In [46]: %timeit tuple(imap(getter, alist)) 
1 loops, best of 3: 264 ms per loop 
+0

(+ 1) 기술적으로 지적할만한 가치가있을 수도 있지만, 이것은 목록의 이해력이 아닙니다 (그러나 OP가 마음에 들지 않을 것이라고 확신합니다 :)) – NPE

+2

you coul d 또한'tuple (map (operator.attrgetter ('foo', 'bar'), alist))'를 실행합니다. 난 당신이 가독성을 위해 게시 한 것을 사용 하겠지만, "attrgetter"는 약간의 성능 이점을 가질 수 있습니다. 당신은'timeit'을해야만하고 이것이 정말로 어려운 루프에 있는지 알아야합니다. – mgilson

+1

이 예제에서 tuple()이 호출되었으므로 목록 이해력과 생성자 표현식의 차이점은 무엇입니까? 양식에 관계없이 동일한 메모리 사용 공간을 소모하지 않습니까? – Octipi