python re.sub() vs str.translate() vs str.replace()

햄도·2021년 3월 11일
0

character 치환하기

자연어처리를 하다보면 문자열을 가공해야 하는 경우가 많은데, 이 때 흔히 re.substr.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() 도 돌려봤다.

사용 메소드ncallstottimepercallcumtime
str.translate()140400.0390.0000.077
str.replace()140400.0400.0000.079
re.sub()140400.0400.0000.080

내가 만든 모듈에서 위의 메서드들을 호출하는 방식으로 사용하고 있고, 프로파일링도 해당 모듈 수행 기준으로 했기 때문에 성능은 cumtime을 기준으로 판단했다.

14000번 호출 당 0.01초 스케일이지만 역시 정규식보다는 문자열 메서드가 더 빠르다. 누가 확인할 일은 별로 없고 자주 호출되는 부분이기 때문에 str.translate()를 사용하기로 했다.

참고

profile
developer hamdoe

1개의 댓글

comment-user-thumbnail
2021년 11월 22일

궁금했던 부분인데 잘 설명해주셔서 정말 감사합니다.

답글 달기