Nice programing

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

nicepro 2020. 10. 26. 21:06
반응형

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


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_alst_b매우 큰 경우 (예 : 수백만 개의 레코드), zip(a, b)두 배의 공백이있는 세 번째 목록을 작성합니다.

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


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


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

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

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

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

참고 URL : https://stackoverflow.com/questions/4989763/when-is-it-better-to-use-zip-instead-of-izip

반응형