현재 Python의 re 모듈은 정규식이 컴파일될 때 그 결과를 내부 캐시에 저장합니다. 따라서 동일한 정규식을 다시 컴파일하려고 하면 새로 연산하지 않고 캐시에서 결과를 가져오기 때문에 추가 비용이 들지 않습니다. 이 캐시는 최대 100개의 항목까지 저장할 수 있으며, 100번째 항목에 도달하면 캐시 전체가 삭제되고 이후에는 다시 컴파일을 수행해야 합니다.
캐시를 통째로 지우는 이유
캐싱의 목적은 함수 호출의 평균 소요 시간을 줄이는 것입니다. 만약 캐시 한도에 도달했을 때 전체를 삭제하는 대신 _cache에 더 많은 정보를 유지하면서 항목을 하나씩 골라내는(parining) 방식을 사용한다면, 그에 따른 오버헤드 때문에 오히려 평균 호출 시간이 늘어나게 됩니다.
_cache.clear() 호출은 매우 빠르게 완료됩니다. 캐시가 모두 사라진다는 점은 아쉽지만, 캐시 상태를 유지하면서 한도 도달 시 개별 요소를 하나씩 제거하는 오버헤드를 감수하는 것보다 전체 삭제가 훨씬 효율적입니다.
캐시 효율 계산 시 고려해야 할 요소
정규식 캐시의 효율성을 평가할 때는 다음과 같은 요소들을 생각해 볼 필요가 있습니다.
- 캐시 히트(hit) 시 평균 호출 시간 (매우 짧음)
- 캐시 미스(miss) 시 평균 호출 시간 (상대적으로 김)
- 캐시 히트 발생 빈도 (비교적 드묾)
- 캐시가 삭제되거나 정리될 때의 호출 시간 (비교적 드묾)
정리
정규식 캐시는 저장된 항목 수가 _MAXCACHE(기본값 100개)에 도달하면 _cache.clear()를 통해 자동으로 초기화됩니다. 참고로 일반적인 사용 환경에서는 개발자가 직접 캐시를 관리할 필요가 없으며, re 모듈이 내부적으로 이 과정을 처리해 줍니다. 다만 패턴을 직접 컴파일하여 재사용하면(re.compile()) 캐시 의존 없이 일관된 성능을 얻을 수 있다는 점도 함께 기억해 두면 좋습니다.