2014-06-19 2 views
0

는 다음 코드를 실행 0) (b, 1) (c, 2) (d, 3) (e, 4)파이썬 izip 메모리 오류()

대신 아래에 복사 한 메모리 오류가 발생합니다. itertools.count() 함수가 my_list의 5 개 레코드로 제한되지 않고 무한 데이터를 반환하는 것으로 보입니까?

line 50, in main 
    for i in itertools.izip([x for x in range(10)], [y for y in itertools.count()]): MemoryError 

답변

4

예, itertools.count은 카운트를 중단하지 않도록 설계되었습니다. 따라서 iterator을 반환하며 한 번에 모든 항목을 처리하지 않고 필요에 따라 항목을 생성합니다.

그러나, 코드의이 부분 :

[y for y in itertools.count()] 

효과적으로 단일 목록에 itertools.count에 의해 생성 된 숫자의 무한한 양을 배치 파이썬을 알려줍니다. 따라서 이 발생합니다.이 작업은 즉시 사용 가능한 모든 메모리를 사용하기 때문입니다.


당신은 단순히 목록 이해 1 제거하여 문제를 해결할 수 :이 변경으로

>>> import itertools 
>>> my_list = ['a', 'b', 'c', 'd', 'e'] 
>>> for i in itertools.izip(my_list, itertools.count()): 
...  print i 
... 
('a', 0) 
('b', 1) 
('c', 2) 
('d', 3) 
('e', 4) 
>>> 

itertools.izip 지금만큼만를 생성합니다 itertools.count()에 의해 반환 된 반복자, 반복됩니다 필요한 숫자. 이 불필요하기 때문에

1


는 너무 다른 지능형리스트를 제거 :이 목록이기 때문에 my_list 이미 반복 가능한 것입니다.

0

왜 이렇게되지 않습니까?

for a,b in enumerate(my_list): 
    print (b, a)