자연어처리를 하다보면 문자열을 가공해야 하는 경우가 많은데, 이 때 흔히 re.sub
나 str.replace
를 사용한다. 오늘도 익숙한 re.sub
를 사용하다가 공식 문서를 봤는데, 아래와 같은 설명이 있었다.
많은 양의 데이터를 한 번에 처리해야 하는 상황이 많기 때문에 항상 정규식 성능에 대한 걱정이 있었는데, 마침 내가 지금 하는 작업이 문자열에서 character를 하나씩 삭제해주는 작업이었기 때문에 str.translate()
가 더 빠르다면 교체하고 싶었다.
# 기존 코드
new_string = re.sub(r'[-_/ ]', '', string)
# 바꾼 코드
pat = '-_/ '
trans = string.maketrans('', '', pat)
new_string = string.translate(trans)
# 바꾼 코드 2 - replace 이용
new_string = string.replace(' ', '').replace('_', '').replace('-', '').replace('/', '')
장단점은 있는것같다. 일단 re.sub()
가 더 익숙하고 다른 개발자들이 해석하기에도 좋아보인다. 코드도 더 짧다. str.translate()
는 그냥 보기에는 뭘 하는지 잘 모르겠다. 그럼 성능은 얼마나 차이날까? 실험하는 김에 str.replace()
도 돌려봤다.
사용 메소드 | ncalls | tottime | percall | cumtime |
---|---|---|---|---|
str.translate() | 14040 | 0.039 | 0.000 | 0.077 |
str.replace() | 14040 | 0.040 | 0.000 | 0.079 |
re.sub() | 14040 | 0.040 | 0.000 | 0.080 |
내가 만든 모듈에서 위의 메서드들을 호출하는 방식으로 사용하고 있고, 프로파일링도 해당 모듈 수행 기준으로 했기 때문에 성능은 cumtime을 기준으로 판단했다.
14000번 호출 당 0.01초 스케일이지만 역시 정규식보다는 문자열 메서드가 더 빠르다. 누가 확인할 일은 별로 없고 자주 호출되는 부분이기 때문에 str.translate()
를 사용하기로 했다.
궁금했던 부분인데 잘 설명해주셔서 정말 감사합니다.