zip
대신 언제 사용 하는 것이 더 낫 itertools.izip
습니까?
답변
생성 된 항목의 전체 목록을 원할 경우 (예 : 해당 목록을 제자리에서 수정하는 함수에 전달). 또는 전달하려는 인수를 강제 zip()
로 해당 특정 지점에서 완전히 평가 되도록 하려면.
답변
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에서 반복기 대신 목록 이 필요할 때 .
답변
