2013-12-11 2 views
1

큰 목록의 문자열이 있으며이 목록에 대한 iteratoe를 원합니다. 목록을 반복하는 가장 좋은 방법은 무엇인지 파악하고 싶습니다. 목록 반복에 대해, ch = itertools.chain(list)이것은 생성자 표현식간에 더 빠르고 효율적이며 큰 목록을 반복하는 itertools.chain입니까?

다른 접근 방식이되어,이 두 가지보다 더 :

  • 발전기 표현 : g = (x for x in list)

  • Itertools.chain 나는 다음과 같은 방법을 사용하여 시도 ?

+1

'itertools.chain (list)'은 무의미합니다. 이 함수는 2 개의 체인이 2 개 이상인 반복자를 설계하여 하나에 적용하면 불필요한 간접 지정 수준 만 제공합니다. –

+0

성능 질문과 마찬가지로 : 측정, 추측하지 마십시오. "timeit"모듈은 친구입니다. http://docs.python.org/2/library/timeit.html –

+1

"itertools.chain을 게시 할 준비가되었지만 병목 현상이 아니라면 문제가되지 않습니다." 나는 제목을 보았으나 여기 두 가지 옵션은 어리 석다. 리스트를 직접 사용하는 대신에 iterator가 정말로 필요하다면,'iter (list)'가 가장 좋은 옵션이지만'for item in list'는 아마 당신이 필요로하는 전부 일 것입니다. (또한 변수'list'를 호출하지 마십시오.'list (something) '를 호출하려고하면 이상한 오류가 발생합니다.) – user2357112

답변

8

을 가장 빠르게하는 방법은 입니다. 이미리스트를 가지고 있다면 더 많은 반복자/생성자를 쌓아두면 어떤 것도 빠르게 진행되지 않을 것입니다.

좋은 이전 for item in a_list:은 다른 옵션보다 빠르며 분명히 더 읽기 쉽습니다.


반복자와 생성기는 목록이 메모리에 아직 저장되어 있지 않은 경우를위한 것입니다. 예를 들어 itertools.count()은 한 번에 하나의 숫자 만 생성합니다. 기존 번호 목록에서 작동하지 않습니다.

다른 가능한 사용법은 여러 작업을 연결하는 경우입니다. 중간 단계는 중간 목록을 만드는 대신 반복자/생성자를 만들 수 있습니다.

total_inches_of_snow = sum(inches_of_snow(date) for date in list_of_dates) 

이를 : 당신이 sum() 호출 목록에 체인으로 각 항목에 대해 조회를하고자하는 경우 예를 들어, 당신은 sum() 후 소비하는 것 조회의 출력 발전기 식을 사용할 수 있습니다 눈의 모든 인치가있는 중간 목록을 작성하지 않고 대신에 sum()을 사용하여 메모리를 절약하므로 생성 할 수 있습니다.