본문 바로가기

TechLog

파이썬 문자열 비교 로직 성능 테스트

요즘 파이썬으로 만드는 프로그램이 있는데, 대규모의 텍스트를 서로 비교할 일이 있을 때 전체 텍스트를 비교하는 대신 텍스트의 길이와 텍스트 일부만 비교하면 좋지 않을까.  그럴 경우 성능 차이가 얼마나 날까 고민해 보다가 몇 가지 비교 로직을 만들어 보았음:

import time
def make_string():
    result = ""
# 1.2MB 분량의 문자열 생성 for i in range(0,100000): result = result + ("A%011d" % i) return result def string_cmp1(): idx = (t1 == t2) return idx def string_cmp2(str_cmp): idx = t2.find(str_cmp) return idx def string_cmp3(str_cmp): idx = t2.find(str_cmp) return idx def string_cmp4(str_cmp): idx = t2.endswith(str_cmp) return idx def string_cmp5(): idx = (len(t1) == len(t2)) return idx def test_string_cmp(): oldtime = time.time() for i in range(0,1000): idx = string_cmp1() print "equal item : %f" % (time.time() - oldtime) oldtime = time.time() str_cmp = t1[:12] for i in range(0,1000): idx = string_cmp2(str_cmp) print "first item : %f" % (time.time() - oldtime) oldtime = time.time() str_cmp = t1[-12:] for i in range(0,1000): idx = string_cmp3(str_cmp) print "last item : %f" % (time.time() - oldtime) oldtime = time.time() str_cmp = t1[-12:] for i in range(0,1000): idx = string_cmp4(str_cmp) print "endswith : %f" % (time.time() - oldtime) oldtime = time.time() for i in range(0,1000): idx = string_cmp5() print "len : %f" % (time.time() - oldtime) t1 = make_string() t2 = make_string() test_string_cmp()

결과는 다음과 같다:
>>> test_string_cmp()
equal item : 0.464837
first item : 0.001063
last item : 2.993316
endswith : 0.000992
len : 0.000714


요약하면, 전체 텍스트가 일치하는지 비교할 때 or 마지막 12글자와 전체 텍스트 길이가 일치하는지를 비교할 때 성능 특성이 어떻게 되는지 보려고 한 테스트이다. 결과를 보고 든 생각은 :

- 의외로 find 함수의 성능이 별로 좋지 않다. 로직을 만들기 시작할 때에는 equal 연산과 속도가 그리 크게 차이나지 않을거라 생각했는데, 찾으려 하는 문자열의 길이가 1보다 클 경우에는 문자열 일부를 계속 비교해야 하다보니 그런 듯. 혹시 찾으려는 문자열이 뒤쪽에 있을 확률이 높다면 rfind를 쓰는 것이 좋을 듯 하다. 

- 1.2MB 분량의 문자열을 1000회 비교하는데 464ms ... 성능개선 따위 해서 뭐해 퉷.

대량의 문자열을 비교하는 로직을 만들 일이 그렇게 많지도 않으려니와 요즘 컴퓨팅 파워가 워낙 좋아 이런 부분까지 최적화하는 노력이 굳이 필요하겠냐만은 ... 뭐 그래도 알아두면 다 쓸 데가 있습니다.



- 테스트 환경
 Intel Core 2 Duo 1.4Ghz
4GB Ram
OS X 10.6.8
Python 2.7.2