두 코드의 차이

lines = “”
for line in open(“max.txt”, “r”).readlines():
    lines += line

와..

lines = []
for line in open(“max.txt”, “r”).readlines():
    lines.append(line)
lines = “”.join(lines)

이거….

둘다 Python 코드인데 매우(?) 큰 파일을 읽을때 속도 차이가 날까?

자바의 String 객체에서 “+”로 스트링을 append 시킬때 StringBuffer의 “append” 메서드를 쓰라고 퍼포먼스 팁에 나와있다.
물론 자바에서 String은 불변 객체이다.
만일
String abs = abs + “감자”;
라는 코드를 칠경우 결과로 나오는 abs 객체는 우측 식에 있는 abs와 동일한 메모리 주소를 가지지 않는다.좌변의 abs는 새로 생겨난 객체이기 때문이다.
물론 우변의 abs는 가바지 컬렉션이 언젠가는(?) 되겠지만 한동안 아니면 한순간이라도 메모리에 상주하고 있기 때문에 리소스를 잡아 먹게된다.
그래서 많은 append가 일어나는 문자열인 경우 StringBuffer를 쓰라고 추천하는것이다.

파이썬에서도 마찬가지일것으로 추측(?) 한다.
파이썬에서도 string 객체는 튜플객체와 함께 불변 시퀀스 타입니다.
string을 과도하게 뒤 붙이기 하는 로직은 코딩상의 편안함이 있을지언정 쓰다만 string 객체가 GC 되기 전까지 리소스를 잡아먹게 되는것이다.
크기가 작은 데이타일경우는 별 상관 없겠지만 큰 데이타일경우 좀 무리수가 따르겠다.

그래서 아래 코드처럼 리스트 객체로 append 시킨다음에 string 으로 변환하기 위해 join을 하면 된다.

휴~~~ 자바를 쬐금 해봐서 그런지 파이썬에서 string을 계속 append 시키는 모듈을 만들었을때 좀 찜찜했는데 저래 하면 되겠군…

근데 문제는 위와같은 파이썬에 대한 내용이 순전히 내 추측에 의존한다는 것이다..ㅋㅋㅋ
물론 충분히 설득력이 있기는 하지만 검증된게 아니기땜시 내일 당장 테스트를 해보고 결과를 올려 놓아야 겠다.

저게 맞다는 판명이 된다면 이번 기회에 아예 파이썬용 StringBuffer 클래스를 만들어 볼까도 생각한다.

[#M_ 클릭! 테스트 결과 | 글 닫기 |
테스트는 HTML 문서에서 TEXT만 뽑아와 새로운 TEXT 문서를 만들어 주는 모듈에서 했다.
물론 같은 HTML문서에서이다.

HTML에서 텍스트를 뽑아와 “+”로 append를 했을경우
아래와 같다.
12개의 링크에 대해서 12번의 모듈 속도 테스트…

하지만 list객체로 apped를 하고 string으로 변환을 시켰을 경우
가변 폭이 좁았고.
대체적인 속도는 아래 캡쳐와 같다.
이거 역시 12개의 링크 테스트

시간이 더 있으면 굉장히 큰 파일도 하고 싶었는데 테스트 느낌(?)상 아래 코드가 빠르다는 잠정적인 결과다.

아마도 큰 파일로 작업을 할경우 시간 차이는 기하급수적으로 늘어날것임이 분명하다._M#]

CC BY-NC 4.0 두 코드의 차이 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.