2016-10-20 4 views
1

나는 thisthis의 질문을 보았으며 동일한 효과를 얻고 싶습니다. 오직 itertool.izip 만 사용하면 효율적이었습니다. 우편 (처럼python에서 itertools.izip의 역함수는 무엇입니까?

) 그것은 내가 메모리에 모든 값을 맞지 않을 수 있기 때문에

내가 반복자를 필요로하는 반복자 대신의 목록을 반환하는 것을 제외 : itertool.izip의 설명서에서

그래서 대신 생성기를 사용하고 값을 반복합니다.

좀 더 구체적으로 말하면, 저는 세 개의 값 튜플을 생성하는 생성자를 가지고 있습니다. 반복하는 대신 세 개의 함수에 세 개의 값 목록을 제공하고 각 목록은 튜플의 단일 위치를 나타냅니다.

세 튜플 값 중에서 큰 값 (메모리 소비량)이 하나만있는 경우 (data이라고 함) 다른 두 값에는 메모리가 거의 필요하지 않은 값만 포함되어 있으므로 data 값의 "값 목록"을 반복하는 것은 data 값을 하나씩 소비하고 작은 값을 캐싱하여 저에게 효과적 일 것입니다.

한 번에 하나의 "값 목록"을 생성하는 스마트 방법을 생각해 볼 수 없습니다. 왜냐하면 튜플의 큰 값에 따라 가끔씩 3 값 터플의 인스턴스를 제거하기로 결정할 수 있기 때문입니다.

널리 제안 zip 솔루션을 사용하여 비슷한에이의 "인수 목록을 풀고"부분에

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)]) 
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)] 

결과 (* [...]) 전체 반복자를 통해 전체 반복을 유발하고, (나는 추측한다) 모든 결과를 메모리에 캐시한다.

마스크 목록을 만들 수 있습니다 (유지할 작은 값에 대해서는 참/거짓 임). 그러나 나는 더 깨끗한 방법을 찾고 있습니다. 다른 모든 것이 실패하면, 나는 그것을 할 것입니다.

+0

따라서 '데이터'값은 3 튜플의 세 번째 항목에 들어가고 첫 번째 항목과 두 번째 항목에 더 짧은 목록이 포함될 수 있습니까? 그 짧은 목록이 고갈되었을 때 일어날 일을 설명해 주시겠습니까? 두 개의 매우 짧은 목록과 약간 긴 목록을 사용하여 명시 적으로 예제를 제공하는 것이 바람직합니다. – barny

+0

@barny 목록 자체의 길이는 모두 동일하므로 목록의 개별 값 크기 (즉, 메모리 요구 사항)에 대해 이야기하고있었습니다. 데이터 값이 너무 커서 메모리를 함께 보관할 수 없습니다. – NirIzr

+0

실제로 프레이 징이 불분명하고 편집되었습니다. – NirIzr

답변

2

기존 루프의 문제점은 무엇입니까?

>>> def gen(): 
...  yield 'first', 0, 1 
...  yield 'second', 2, 3 
...  yield 'third', 4, 5 
... 
>>> numbers = [] 
>>> for data, num1, num2 in gen(): 
...  print data 
...  numbers.append((num1, num2)) 
... 
first 
second 
third 
>>> numbers 
[(0, 1), (2, 3), (4, 5)] 
+0

고마워,이 일을 할 수 있지만 다른 값을 다른 목록에 추가 할 수 있도록 값을 통해 반복하는 방법을 제어하지 않고 라이브러리 함수에 데이터 생성기를 전달 해요. – NirIzr

+0

@NirIzr - 래퍼를 만드시겠습니까? – TigerhawkT3

+0

네, 고마워요! 어떻게 내가 그것을 간과하는지 잘 모르겠다. – NirIzr