2010-02-24 3 views
4

디렉토리 목록을 만들고 그 안에있는 파일을 읽는다면 디렉토리의 모든 파일 목록을 반환하는 것과 비교할 때 어느 시점에 수익률의 성능이 저하되기 시작합니까?파이썬에는 "yield statements too many"같은 것이 있습니까?

여기에 (잠재적으로 거대한) 목록을 반환하는 데 충분한 RAM이 있다고 가정합니다.

추신 : 나는 코멘트에 코드를 인라 인하는 데 문제가있어 여기에 몇 가지 예를 들어서 보겠습니다.

def list_dirs_list(): 
    # list version 
    return glob.glob(/some/path/*) 

def list_dirs_iter(): 
    # iterator version 
    return glob.iglob(/some/path/*) 

둘 다 glob에 대한 호출은 os.listdir을 사용하므로 성능면에서 동등한 것처럼 보입니다. 그러나 this Python doc은 glob.iglob가 더 빠르다는 것을 의미하는 것으로 보입니다.

+1

관심사를 나타내는 코드를 공유 하시겠습니까? –

+0

@saidimu : 나는 그 페이지를보고있다. 그러나 나는 그것이 'iglob()'가 더 빠르다는 것을 볼 수 없다. 그것은'iglob()'가 결과를 * 실제로 "모두 동시에 저장하지 않고"리턴하지만 * 반드시 성능에 대해 암시하지는 않습니다. –

+0

나는 이들 모두를 동시에 저장하지 않아도 양의 속도 (및 메모리) 함의를 가지고 있다고 가정 할 것인가? – saidimu

답변

2

디렉토리 목록 작성 방법에 따라 다릅니다. 파이썬의 대부분의 메커니즘은 전체 디렉토리 목록을 목록으로 가져옵니다. 그런 식으로한다면 한 번의 수율로도 낭비입니다. opendir(3)을 사용하는 경우 XKCD의 "임의"정의에 따라 아마 임의의 숫자 일 것입니다.

+0

감사합니다. os.listdir과 os.walk 사이에서 논쟁을 벌였습니다.하지만 필자는 그 관점이 현재는 (성능 관점에서) 논리적이라고 가정합니다. 일반적으로 너무 많은 수확량이 문제가되는 경우가 있습니까 (예 : 파이썬의 구현 가정 등으로) – saidimu

+0

마음에 아무것도 들지 않습니다. –

5

yield을 계속 사용하면 성능이 저하되지 않습니다. 실제로 목록에있는 것들을 조합하는 것과 비교할 때 yield은 실제로 비교할 때 더 많은 요소가 향상됩니다.

1

수율을 사용하여 구현 또는 성능 관점에서조차도 functor 클래스를 작성하는 것과 기능상 유사합니다. 실제로는 자체 생성 클래스의 __call__ 메소드보다 조금 더 빠르게 생성기를 호출 할 수 있습니다. 생성기의 C 구현에 내장되어 있습니다.

파이썬 2.7에서 glob의 정의 그래서 적어도에 대한

def glob(pathname): return list(iglob(pathname))

입니다
def generator_counter(): 
    i = 0 
    while True: 
     i += 1 
     yield i 

class functor_counter(): 
    def __init__(self): 
     self.i = 0 
    def __call__(self): 
     i += 1 
     return i 
0

:

이 가정, 사용 및 다음의 거친 구현을 망치는 동일합니다 이 버전 globiglob보다 빠를 수 없습니다.