zip
대신 언제 사용 하는 것이 더 낫 itertools.izip
습니까?
zip
기능은 Python 2의 izip
. 일반적으로 Python 3는 범위, 필터, dict 함수 등과 같은 반복자를 사용하도록 대부분의 함수를 변경했습니다.
zip
대신 언제 사용 하는 것이 더 낫 itertools.izip
습니까?
zip
기능은 Python 2의 izip
. 일반적으로 Python 3는 범위, 필터, dict 함수 등과 같은 반복자를 사용하도록 대부분의 함수를 변경했습니다.
답변:
생성 된 항목의 전체 목록을 원할 경우 (예 : 해당 목록을 제자리에서 수정하는 함수에 전달). 또는 전달하려는 인수를 강제 zip()
로 해당 특정 지점에서 완전히 평가 되도록 하려면.
izip
에만을 재사용 하므로 아무것도 얻지 못합니다. 그게 내가 사용하지 않는 작은 이유가 있다고 동의 있도록 손실이 너무 사소한 말했다 독점적으로 포장 당신이 필요한 경우가 ; 당신은 실제로 추가하여이에게 "적절한"방법을 할 수있는 일반하게 Py2 코드에 로를 (Py3 전환 준비). tuple
tuple
izip
list
list
from future_builtins import zip
zip
izip
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_a
및 lst_b
매우 큰 경우 (예 : 수백만 개의 레코드), zip(a, b)
두 배의 공백이있는 세 번째 목록을 작성합니다.
그러나 목록이 작 으면 zip
더 빠를 수 있습니다.
itertools 라이브러리는 일반적인 Python 함수에 대한 "반복자"를 제공합니다. itertools 문서에서 "목록 대신 반복자를 반환한다는 점을 제외하면 zip ()과 유사합니다." izip ()의 I는 "반복자"를 의미합니다.
Python 반복기는 일반 메모리 내 목록에 메모리를 절약하는 "지연로드"시퀀스입니다. 따라서 두 입력 a, b가 너무 커서 한 번에 메모리에 보관할 수 없을 때 itertools.izip (a, b)를 사용합니다.
효율적인 순차 처리와 관련된 Python 개념을 찾아보십시오.
"generators" & "yield"
"iterators"
"lazy loading"
2.x에서 반복기 대신 목록 이 필요할 때 .
itertools.izip()
순전히 통계적인 이득을 제외하고 선호하는 경향 이 있습니다.
lst = zip(lst_a, lst_b)
허용 lst[1]
또는 len(lst)
. 그러나, ilst = itertools.izip(lst_a, lst_n)
당신은 ilst[1]
또는 len(ilst)
.
zip
너무 분명하지만 여전히 지적 할 가치가있는 이유izip
는iterator
한 번만 순회 할 수있는를 반환하기 때문 입니다. 즉ii = izip(a,b) ; f(ii) ; g(ii)
, 여기에서 빈 목록[]
이에 전달됩니다g
.