2014-11-17 2 views
2

나는 내 일부 오래된 코드를 읽고이 줄을 건너 온 한중첩 된 반복자 사용에 대한 요점이 있습니까?

itertools.starmap(lambda x,y: x + (y,), 
        itertools.izip(itertools.repeat(some_tuple, 
                len(list_of_tuples)), 
           itertools.imap(lambda x: x[0], 
               list_of_tuples))) 

명확하게하기 위해, 나는 약간의 list_of_tuples가있는 나는 각 튜플합니다 (itertools.imap)에서 첫 번째 항목을 얻고 싶은이, I list_of_tuples에 각 튜플에 대한 복사본이 있으므로 (itertools.repeat) 반복하고자하는 튜플을 가지고 있고 list_of_tuples (itertools.starmap)의 항목을 기반으로 새로운 더 긴 튜플을 만들고 싶습니다.

예를 들어, some_tuple = (1, 2, 3)list_of_tuples = [(1, other_info), (5, other), (8, 12)]이라고 가정합니다. [(1, 2, 3, 1), (1, 2, 3, 5), (1, 2, 3, 8)]과 같은 것을 원합니다. 이것은 정확한 입출력 (꽤 무관하고 복잡한 클래스를 사용합니다)이 아니며 실제 목록과 튜플이 매우 큽니다.

이터레이터를 중첩하는 요점이 있습니까? itertools의 각 함수가 내가 준 iterator를 반복하고 어딘가에 정보를 저장해야하는 것처럼 보입니다. 이는 다른 반복자를 starmap 안에 넣는 것이 아무런 이점도 없다는 것을 의미합니다. 나는 완전히 틀린가? 이게 어떻게 작동합니까?

+0

예상되는 입력과 출력을 보여 주면 수행 한 작업을 매핑하는 것이 좋습니다. – Hackaholic

+0

아니요, 간단한 이유 때문에 코드를 따르기가 너무 어렵습니다. 그것을 간단하게 유지하십시오 –

+0

@gnibbler는 그것을 그대로 유지할 수도 있습니다. 심지어 그것을 제거하면 우리가 반복자를 중첩시켜줍니다. 따라서 그 변경 사항을 제거하지 않으면 일반적으로 중첩 할 지점이 있는지 궁금합니다. – Dannnno

답변

2

둥지 반복자 할 이유가 없습니다에 성능상의 이점을 가질 수 있습니다. 변수 사용 성능/메모리에 눈에 띄는 효과가 없습니다 : 메모리에있는 모든 항목을 저장하지 않는 itertools에서 사용하는 반환

first_items = itertools.imap(lambda x: x[0], list_of_tuples) 
repeated_tuple = itertools.repeat(some_tuple, len(list_of_tuples)) 
items = itertools.izip(repeated_tuple, first_items) 
result = itertools.starmap(lambda x,y: x + (y,), items) 

반복자 객체를하지만, 필요할 때 간단하게 다음 항목을 계산합니다. 그들이 어떻게 일하는지에 관해 더 많이 읽을 수있다 here.

+0

내 질문이 실제로 무엇을 요구했는지 생각합니다. 반복기를 중첩하지 않으면 내가 원하는 것보다 많은 것을 메모리에 저장하게 될지 확실하지 않았습니다. 감사! – Dannnno

1

나는이 경우에 위의 결합이 필요하다고 생각하지 않습니다.

는이 발전기 표현에 해당하는 것으로 나타납니다

(some_tuple + (y[0],) for y in list_of_tuples) 

그러나 때때로 itertools 특히 CPython의

+0

그래서 제가보기에 제가 준 예제를 무시하면 좋지 않습니다. 일반적으로 이터레이터의 중첩은 프로그램의 성능에 긍정적이거나 다른 어떤 영향을 미칩니 까? 아니면이 사건을 결정해야할까요? – Dannnno

+2

@ 단노 (Dannnno), 가장 독해 가능한 방식으로 코드를 작성해야합니다. 성능 병목 현상이 발생하면 빨리 생각할 수있는 방식으로 다시 작성합니다. 읽기 쉬운 버전을 문서로 보관하십시오. 두 버전 모두에 대해 단위 테스트를 작성하여 빠른 버전에서 우발적으로 동작이 변경되었는지 감지 할 수 있습니다. –