zip대신 언제 사용 하는 것이 더 낫 itertools.izip습니까?
zip기능은 Python 2의 izip. 일반적으로 Python 3는 범위, 필터, dict 함수 등과 같은 반복자를 사용하도록 대부분의 함수를 변경했습니다.
zip대신 언제 사용 하는 것이 더 낫 itertools.izip습니까?
zip기능은 Python 2의 izip. 일반적으로 Python 3는 범위, 필터, dict 함수 등과 같은 반복자를 사용하도록 대부분의 함수를 변경했습니다.
답변:
생성 된 항목의 전체 목록을 원할 경우 (예 : 해당 목록을 제자리에서 수정하는 함수에 전달). 또는 전달하려는 인수를 강제 zip()로 해당 특정 지점에서 완전히 평가 되도록 하려면.
izip에만을 재사용 하므로 아무것도 얻지 못합니다. 그게 내가 사용하지 않는 작은 이유가 있다고 동의 있도록 손실이 너무 사소한 말했다 독점적으로 포장 당신이 필요한 경우가 ; 당신은 실제로 추가하여이에게 "적절한"방법을 할 수있는 일반하게 Py2 코드에 로를 (Py3 전환 준비). tupletupleiziplistlistfrom future_builtins import zipzipizip
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.