python에서 파일 크기 비교를 하려 하는데 뭐가 더 효율적일까요

조회수 1086회

파이썬에서 몇개의 파일의 크기를 비교하는 작업을 하려 하는데 os.path.getsize(path) 라는 함수를 써서 비교하는거랑 f = open("~~~.txt", 'r') 로 읽고 루프문으로 eof 나올때까지 카운트해서 비교하는게 빠를까요? 그냥 생각했을땐 os.path.getsize를 이용하는게 빨라보이는데 이 함수가 어떻게 동작하는지를 정확하게 몰라서..ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 당연한 질문입니다. os.path.getsize 을 사용하는 것이 가장 빠릅니다.

    os.path.getsize 는 내부에서 os.stat 를 호출하여 정보를 얻습니다.

    os.stat 의 리턴값중 st_size 필드가 os.path.getsize 값입니다.

    https://docs.python.org/ko/3/library/os.html#os.stat

    파이썬은 builtin 함수을 포함해서 os 모듈의 함수들은 c로 구현되어 있습니다.

    builtin 함수들은 성능상의 이유로 os 모듈은 os 관련 작업들이니 os의 api를 호출해야하겠지요.

    실제 구현소스에 관심이 있다면 하단의 링크에서 posix_do_stat 함수를 보시면 됩니다.

    https://github.com/python/cpython/blob/master/Modules/posixmodule.c

    궁극적으로 *nix 일 때는 fstat 함수를 윈도우일 때는 GetFileInformationByHandle 를 호출합니다.

    더 작은 오버헤드를 원한다면 ctypes 로 직접 fstat, GetFileInformationByHandle 를 호출해도 됩니다.

    • 감사합니다 ㅎㅎ !! 마지막에 적어주신 방법 잘 사용하겠습니다~~ 알 수 없는 사용자 2019.5.15 14:14
  • 단지 파일 크기를 재기 위해 파일을 실제로 읽는 방법은 별로 안 좋은 아이디어라고 생각됩니다.

    • 프로그램에 할당된 메모리보다 파일 크기가 클 경우 프로그램은 메모리 부족으로 중단됩니다. 사실은 높은 확률로, 그보다 더 작은 파일에 대해서도 메모리가 튈 겁니다.
    • os.path.getsize()는 파일이 '접근 불가할 때' 예외가 떨어지지만 open()은 파일을 '열 수 없을' 경우 IOException 예외가 납니다. 그런데 파일에 '접근 불가'한 경우는 잘 없지만(주로 권한 문제) 파일을 열 수 없는 경우는 꽤 흔합니다(누가 편집 중이라거나 다른 프로그램에서 열어놓고 있거나 등).
    • 파일 크기는 단순한 정보입니다. os.path.getsize() 메소드 하나로 단순하게 접근하면 충분합니다. 무한루프를 도는 것은 매우 비용과 위험이 큰 작업이며 반드시 그렇게 해야 할 이유가 필요합니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)