본문 바로가기

프로그래밍

[Python] Efficiency 1 - String Concatenatio

Python에서 String을 붙이는 방법은 단순히 '+' Operator 를 사용하면 됩니다. 

 

1
NEW = "ABC" + "DEF"
 

오늘은 성능의 측면에서 문자열을 붙이는 방법에 대하여 살펴보겠습니다. 

 

 

String이란?

 

C 에서는 문자열을 character 배열에 대한 포인터로 사용했습니다. 

python에서는 단순히 alphabet = "3323"  등으로 선언을 해주면 문자열을 이어 붙이는 것은 단순히 뒤에 붙이는 것으로보입니다. 그러나 실제로는 

"ABC" + "DEF" 의 결과물은 앞의 두 문자열과 관계없는 새로운 "ABCDEF" 스트링 객체 입니다. 

[새로운 객체를 생성하는 것입니다.]

이는 당연히 + 연산을 한만큼 새로운 객체를 생성하는 것과 같습니다. 

 

즉 "ABC" 의 뒤에 "DEF"를 붙이는 게 아닌!

새로운 객체를 생성해서 ABCDEF로 초기화 해주는 것 입니다. 

 

이는 string이 immutable 클래스로 한 번 값이 정해지면 수정이 불가능하기 때문입니다.

리스트는 이와 다르게 뒤에 값을 추가하거나 빼거나 더할 수 있습니다.

따라서 효율성을 위해서 string + 연산자가 아닌 리스트를 이용해야 합니다.

 

 

 

--------------------------------------------------------------

EXPERIMENT 1 string 에 a 를 만 개 붙이는 for 문

1
2
3
string = ""
for i in range(10000):
    string  += "a"
  

RESULT 1

 

1
총 걸린 시간 : 0.3959634304046631
 

시간이 0.4초 정도 걸립니다.

--------------------------------------------------------------

EXPERIMENT 2 

1
2
3
4
lst = []
for i in range(1000000):
   lst.append("a")
string = "".join(lst)
 

RESULT 2

1
총 걸린 시간 : 0.2060694694519043
 

0.2초 정도로 lst를 이용해서 append를 하고 다시 string으로 만드니 시간이 절약되었습니다.

리스트를 이용하면 새로운 객체를 생성하지 않아서 시간이 훨씬 절약됩니다.

--------------------------------------------------------------

 

#시간을 측정하는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
# Library ----------------------
import time
 
# ------------------------------
start = time.time()  # 시작 시간
 
string = ""
for i in range(1000000):
    string += "a"
 
print(f"총 걸린 시간 : {time.time()-start}"# 시간 차이 빼기
 
# -------------------------------
cs

 

 

 

참고 : Data structures & Algorithms in Python - Michael T. Goodrich, Roberto Tamassia, Michel H. Goldwasser