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