2011-02-14 3 views

답변

33

전체 목록의 목록이 생성되기를 원할 때 (예 : 해당 목록을 수정하는 함수에 전달하기 위해). 또는 전달하려는 인수를 zip()에 강제로 적용하려면 특정 시점에서 완전히 평가되어야합니다.

+1

튜플을 재사용하고 izip을 사용하지 않을 실제 이유가 없으므로 첫 번째 경우에 izip을 더 빨리 사용하는 것이 더 좋지 않겠습니까? – user1815201

+1

@ user1815201 :'izip'은'tuple'이 다음 반복이 시작되기 전에 해제 된 경우에만'tuple'을 재사용하므로 아무 것도 얻을 수 없습니다. 즉, 모든 손실은 너무 작습니다. 그래서'izip'을 독점적으로 사용하지 않을 이유가 거의 없다는 것에 동의합니다.'list'가 필요한 경우'list'로 래핑됩니다. Python 코드에'future_builtins import zip'을 추가하여 실제로''zip'을'izip' (Py3 변환 준비)으로 만들면 실제로 "적절한"방법이 될 수 있습니다. – ShadowRanger

4

2.x에서는 이 필요하며 반복기 대신 목록이 필요합니다.

+0

그 일이 일어날 수있는 예를 들어 주시겠습니까? –

+3

아닙니다. 그래서 나는 itertools.izip()을 선호하는 경향이 있는데, 이득이 순전히 통계적 일 때를 제외하고. –

+2

목록이 필요한 경우 색인으로 결과 항목에 액세스하거나 전체 길이를 찾아야 할 때입니다. 'lst = zip (lst_a, lst_b)'는'lst [1]'또는'len (lst)'를 허용합니다. 그러나,'ilst = itertools.izip (lst_a, lst_n)'에 대해서'ilst [1]'또는'len (ilst)'를 시도하는 것은 실패 할 것입니다. –

79

zip은 모든 목록을 동시에 계산하므로 izip은 요청할 때만 요소를 계산합니다.

>>> l1 = [1, 2, 3, 4, 5, 6] 
>>> l2 = [2, 3, 4, 5, 6, 7] 
>>> z = zip(l1, l2) 
>>> iz = izip(l1, l2) 
>>> isinstance(zip(l1, l2), list) 
True 
>>> isinstance(izip(l1, l2), list) 
False 
>>> z[::2] #Get odd places 
[(1, 2), (3, 4), (5, 6)] 
>>> iz[::2] #Same with izip 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'itertools.izip' object is unsubscriptable 
:

한 가지 중요한 차이는 'izip'은 목록이 아닙니다 (예 : 인덱싱) 목록 - 특정 기능을 지원하지 않는 'izip 객체를'반환 '지퍼'실제 목록을 반환한다는 것입니다

목록이 필요한 경우 (목록과 같은 객체가 아닌 경우) '우편 번호'만 사용하십시오.

'izip'은 메모리 또는주기 저장에 유용 할 수 있습니다.

예. 다음 코드는 몇 사이클 이후에 종료 될 수 있습니다, 그래서 통합 목록의 모든 항목을 계산할 필요가 없습니다 : zip를 사용

lst_a = ... #list with very large number of items 
lst_b = ... #list with very large number of items 
#At each cycle, the next couple is provided 
for a, b in izip(lst_a, lst_b): 
    if a == b: 
     break 
print a 

모든(a, b) 커플주기를 입력하기 전에 을 계산 한 것입니다.

또한 lst_alst_b이 매우 큰 경우 (예 : 수백만 개의 레코드) zip(a, b)은 두 번째로 세 번째 목록을 작성합니다.

하지만 작은 목록이있는 경우 zip이 빠릅니다.

+4

감사합니다. 그러나 이것은 주로'izip'이'zip'보다 나은 때 대답합니다 ... –

+6

당신 말이 맞아요. 나는 좋은 의도로 시작한 다음 이론적 인 내용으로 떨어졌습니다 ... – Don

3

itertools 라이브러리는 일반적인 Python 기능을위한 "반복자"를 제공합니다. itertools 문서에서 "목록 대신 반복자를 반환한다는 점을 제외하면 zip()과 유사합니다." izip()의 I는 "반복자"를 의미합니다.

파이썬 이터레이터는 정기적 인 메모리 목록보다 메모리를 절약하는 "지연로드"시퀀스입니다. 따라서 두 입력 a, b가 너무 커서 한 번에 메모리에 보관할 수없는 경우 itertools.izip (a, b)를 사용합니다.

효율적으로 순차 처리와 관련된 파이썬 개념 찾기 : 지적 여전히 가치가 아직 zip``찬성

"generators" & "yield" 
"iterators" 
"lazy loading" 
+0

멋지게 설명했습니다. –

관련 문제