2013-08-08 2 views
1

나는 최근에 this question에게 물었고 os.walk 명령과 관련된 멋진 답변을 얻었습니다. 내 스크립트는 이것을 사용하여 for root, dirs, files in os.walk(drive):을 사용하여 특정 폴더의 전체 드라이브를 검색합니다. 불행히도 600GB 드라이브의 경우 약 10 분이 소요됩니다.신속하게 파이썬으로 드라이브 검색

더 효율적인 명령을 사용하여 더 효율적으로 사용할 수 있습니까? 감사!

+2

입니다. 600GB 드라이브를 통과하는 데 걸리는 시간은 대략입니다. 더 나은 성능을 원하면 전체 드라이브를 무차별 적으로 검색하는 것이 아닌 전략을 생각해야합니다. – roippi

+0

이 작업을 더 빠르게 수행 할 수있는 유일한 방법은 (a) 검색 할 필요가 없도록 폴더 색인을 유지하거나 (b) Windows 데스크톱 검색 또는 스포트라이트와 같이 OS가 유지 관리하는 색인에 액세스하거나 (c))는 파일 시스템에 의해 관리되는 색인에 접근합니다 ('ctypes' 또는 유사한 것을 통해 파이썬으로 감싸지 않은 저수준 함수를 호출해야하며 루트/관리자 권한이 필요할 수도 있습니다). – abarnert

답변

3

작은 지속적인 개선을 찾고 있다면 대부분의 플랫폼에서 os.walk보다 나은 방법이 있습니다. 특히

walk 단지 그들이 정보가 키 (Windows) 또는 수에도 불구하고,하지 디렉토리인지 확인하기 위해 stat 많은 일반 파일을 가진 끝 (대부분의 * nix에서 스크립트 시스템) 낮은 수준에서 이미 아피스. 불행하게도이 정보는 Python 수준에서 사용할 수 없지만 ctypes을 통해 또는 C 확장 라이브러리를 작성하거나 scandir과 같은 타사 모듈을 사용하여 얻을 수 있습니다.

플랫폼 및 디렉토리 레이아웃의 세부 사항에 따라 10 %에서 90 % 사이의 시간이 소요될 수 있습니다. 그러나 여전히 시스템의 모든 디렉토리를 검사해야하는 선형 검색이 될 것입니다. 그보다 더 좋은 방법은 일종의 색인에 액세스하는 것입니다. 플랫폼에 이러한 색인 (예 : Windows 데스크톱 검색 또는 스포트라이트)이있을 수 있습니다. 당신의 파일 시스템은 (물론 저수준의 호출이 필요하고 루트/관리자 액세스가 필요할 수도 있습니다), 또는 독자적으로 파일 시스템을 구축 할 수 있습니다.

+0

간단히 말해, 'os.walk'으로 쉽게 할 수있는 방법이 없으며 대신 제 3자인 '스캔들'을 사용해야합니다. – wnnmaw

+0

@wnnmaw : 만약 "do it"이라면 "작은 지속적인 개선"을 의미합니다. 그렇다면'os.walk'는'os.walk'보다 빨리 갈 수 없지만'scandir' 또는 다른 써드 파티 라이브러리들 양철통. 보다 근본적인 개선을 원한다면,하고있는 일을 근본적으로 바꿔야 할 것입니다. – abarnert

1

subprocess.Popen을 사용하여 네이티브 '찾기'프로세스를 시작하십시오.

+0

'find'는'os.walk'와 같은 일을 효과적으로합니다. 그것은 일정한 요소에 의해 더 빠를 수 있습니다 (왜냐하면 많은 파일을 stat로 계산할 필요가 없기 때문입니다). 그러나 여전히 모든 것을 걷고 있습니다. 물론 유닉스에서만 작동합니다. – abarnert

+0

윈도우에서 'out, err = subprocess.Popen ('dir/s/ad c : \ myfolder ', shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) .communicate()' – tdelaney

0

scandir.walk(path)은 결과가 2-20 배 빨라서 os.walk(path)이됩니다. 이 모듈을 사용할 수 있습니다. pip install scandir 여기에 대한 문서는 scandir

관련 문제