2009-06-07 5 views
9

그냥 파이썬 생성기를보고, 진짜로 감명 받았지만 사용하지 않는 것이 있습니까? 나는 파일에서 읽는 곳이나 사용자 행동이 영역이되는 과거의 C 코드를 생각하고있었습니다. 예를 들어, 사용자가 입력 (기본 데이터 입력?) 및 입력하는 호출 기능 프로세스를 묻는 데 생성기를 사용할 수 있습니까? 거기에 성능이나 정리 문제가 있습니까?파이썬 생성기 - 그것을 사용하지 않으려 고합니다

답변

12

하나의 문제는 그들이 얻을 것입니다 :

>>> def generatorForEvenKeys(aDictionary): 
    for k in aDictionary: 
     if k % 2 == 0: yield aDictionary[k] 

>>> x = generatorForEvenKeys(someDictionary) 
>>> pickle.dump(x,file('temp.dat','wb')) 

는 당신에게 다음과 같은 오류를 가져옵니다 "소비." 즉, 시퀀스를 다시 반복해야하는 경우 생성기를 다시 만들어야합니다.

게으른 평가가 문제인 경우 발전기식이 필요하지 않을 수 있습니다. 예를 들어 모든 계산을 앞에서 수행하려는 경우 (예 : 리소스를 해제 할 수 있도록) 목록 이해 또는 for 루프가 가장 좋습니다.

psyco을 사용하면 생성자가 아닌 목록 표현식과 루프에서 속도가 상당히 빨라집니다.

또한 오히려 분명히 시퀀스 길이를 앞당겨 야 할 필요가 있다면 생성기를 원하지 않을 것입니다. 당신이 (xrange 파이썬 2.x에서의 range 낮은 것보다 훨씬 더 긴 시퀀스를 지원하는 이유는) 당신이 필요로 할 때 뭔가 메모리에 전체 목록을 유지하지 않고, iterateable 수

을하고자 할 때

13

발전기가 잘 유지되지 않습니다.

일반적으로 생성기 개체를 유지하려고하는 중 오류가 발생합니다. 발전기

TypeError: can't pickle generator objects 
+0

+1 좋은 – ebo

+0

을 알고 당신은 예를 들어 줄 수 있습니까? – bayer

+0

bayer : 다음과 같은 예 : 텍스트 문서를 반복하고 단어를 반환합니다. 필자는 생성기를 피클 링하여 텍스트 문서를 계속 읽을 수 있도록하고 싶습니다. 죄송합니다. 캔트. 이 얼마나 피타. –

1

당신은 발전기를 사용 전체 "물건 목록"을 메모리에로드하려면 생성기 사용에 별다른 의미가 없습니다. 목록을 반환 할 수도 있습니다. A (약간 인위적인) 예를 들어

: 단지 효율적으로

def my_pointless_generator(x): 
    thedata = range(x) # or thedata = list(range(x)) in Python 3.x 
    for x in thedata: 
     yield x 

를 다시 쓸 수 ..can ..

def my_pointless_generator(x): 
    return range(x) 
관련 문제