izip 대신 zip을 사용하는 것이 더 좋은 때는 언제입니까?


82

zip대신 언제 사용 하는 것이 더 낫 itertools.izip습니까?


를 찬성하는 한 가지 이유는 zip너무 분명하지만 여전히 지적 할 가치가있는 이유 izipiterator한 번만 순회 할 수있는를 반환하기 때문 입니다. 즉 ii = izip(a,b) ; f(ii) ; g(ii), 여기에서 빈 목록 []이에 전달됩니다 g.
인과 관계

6
참고로, Python 3의 zip기능은 Python 2의 izip. 일반적으로 Python 3는 범위, 필터, dict 함수 등과 같은 반복자를 사용하도록 대부분의 함수를 변경했습니다.
Charles L.

답변:


44

생성 된 항목의 전체 목록을 원할 경우 (예 : 해당 목록을 제자리에서 수정하는 함수에 전달). 또는 전달하려는 인수를 강제 zip()로 해당 특정 지점에서 완전히 평가 되도록 하려면.


1
튜플을 재사용하고 izip을 사용하지 않을 실제 이유가 없기 때문에 첫 번째 경우 izip을 사용하는 것이 더 빠르지 않습니까?
user1815201 2013

1
@ user1815201 : 다음 반복이 시작되기 전에 릴리스 된 경우 izip에만을 재사용 하므로 아무것도 얻지 못합니다. 그게 내가 사용하지 않는 작은 이유가 있다고 동의 있도록 손실이 너무 사소한 말했다 독점적으로 포장 당신이 필요한 경우가 ; 당신은 실제로 추가하여이에게 "적절한"방법을 할 수있는 일반하게 Py2 코드에 로를 (Py3 전환 준비). tupletupleiziplistlistfrom future_builtins import zipzipizip
ShadowRanger 2015

99

zip모든 목록을 한 번에 izip계산하고 요청 된 경우에만 요소를 계산합니다.

한 가지 중요한 차이점은 'zip'은 실제 목록을 반환하고 'izip'은 목록이 아니며 목록 별 기능 (예 : 인덱싱)을 지원하지 않는 '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

따라서 목록 (목록과 유사한 객체가 아님)이 필요하면 'zip'을 사용하십시오.

이 외에도 'izip'은 메모리 나주기를 절약하는 데 유용 할 수 있습니다.

예를 들어 다음 코드는 몇주기 후에 종료 될 수 있으므로 결합 된 목록의 모든 항목을 계산할 필요가 없습니다.

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

using zip은 사이클에 들어가기 전에 모든 (a, b) 커플 을 계산했을 것 입니다.

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

그러나 목록이 작 으면 zip더 빠를 수 있습니다.


9
네가 옳아. 좋은 의도로 시작한 다음 이론적 인 부분에 빠졌습니다 ...
Don

6

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

Python 반복기는 일반 메모리 내 목록에 메모리를 절약하는 "지연로드"시퀀스입니다. 따라서 두 입력 a, b가 너무 커서 한 번에 메모리에 보관할 수 없을 때 itertools.izip (a, b)를 사용합니다.

효율적인 순차 처리와 관련된 Python 개념을 찾아보십시오.

"generators" & "yield"
"iterators"
"lazy loading"

잘 설명했습니다.
Rahul

5

2.x에서 반복기 대신 목록 이 필요할 때 .


그럴 수있는 예를 들어 주실 수 있습니까?
Neil G

3
별로. 그래서 itertools.izip()순전히 통계적인 이득을 제외하고 선호하는 경향 이 있습니다.
Ignacio Vazquez-Abrams

2
목록이 필요한 한 가지 경우는 색인별로 결과 항목에 액세스하거나 전체 길이를 찾아야하는 경우입니다. lst = zip(lst_a, lst_b)허용 lst[1]또는 len(lst). 그러나, ilst = itertools.izip(lst_a, lst_n)당신은 ilst[1]또는 len(ilst).
Jan Vlcinsky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.