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_a
및 lst_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
'Nice programing' 카테고리의 다른 글
어떤 단위 테스트 프레임 워크? (0) | 2020.10.26 |
---|---|
git 저장소에서 파일을 완전히 제거하려면 어떻게해야합니까? (0) | 2020.10.26 |
심볼릭 링크를 제거하려면 어떻게합니까? (0) | 2020.10.26 |
Haml에서 if 조건을 작성하는 방법은 무엇입니까? (0) | 2020.10.26 |
CSS 미디어 쿼리-소프트 키보드가 CSS 방향 규칙을 위반 함-대체 솔루션? (0) | 2020.10.26 |