>

정규식을 동적으로 생성하는 응용 프로그램 코드가 있습니다 일부 구문 분석을 위해 구성에서. 두 변형의 성능을 타이밍 할 때 정규식 변형 OR 정규식의 각 부분을 캡처하면 정규 정규식. 그 이유는 정규식 모듈에서 내부적으로 특정 작업의 오버 헤드 때문입니다.

>>> import timeit
>>> setup = '''
... import re
... '''   
#no capture group 
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.922958850861
#with capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.44321084023
#no capture group
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.913202047348
# capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.41544604301

질문 :캡처 그룹을 사용할 때 성능이 크게 저하되는 원인은 무엇입니까?


  • 답변 # 1

    귀하의 패턴은 캡처 그룹에서만 다릅니다. 정규식 패턴에서 캡처 그룹을 정의하고 패턴을 re.search 와 함께 사용하는 경우 결과는 MatchObject 입니다.  예. 각 일치 오브젝트에는 비어있는 경우에도 패턴에 캡처 그룹이있는 수만큼그룹이 포함됩니다. 이것이 re 의 오버 헤드입니다  내부 : 그룹 목록 (메모리 할당 등) 추가. 그룹에일치하는 텍스트의 시작 및 끝 색인등 세부 정보가 포함되어 있다는 점에 유의하십시오 ( MatchObject 참조).  참조).

  • 답변 # 2

    이유는 매우 간단합니다. 캡처 그룹을 사용하면 콘텐츠를 메모리에 저장하는 엔진이 표시되고 캡처 그룹이 아닌 그룹을 사용하면 아무것도 저장하지 않는 엔진이 표시됩니다. 엔진에 더 많은 작업을 수행하도록 지시하고 있다고 가정하십시오.

    예를 들어,이 정규식을 사용하면  또는 (hello|bye|ola|cheers)  원자 그룹 또는 (hello)|(bye)|(ola)|(cheers) 와 같은 비 캡처 그룹을 사용하는 것보다 상당히 높은 영향을 미칩니다. .

    regex를 사용할 때 위와 같은 내용을 캡처할지 여부를 알고 있습니다. 이러한 단어를 캡처하려는 경우 성능이 저하되지만 콘텐츠를 캡처 할 필요가없는 경우 캡처하지 않은 그룹을 사용하는 것처럼 개선하여 성능을 절약 할 수 있습니다

    파이썬에 태그를 달았지만 js 정규식 엔진에서 캡처 및 비 캡처 그룹이 미치는 영향을 보여주기 위해 자바 스크립트에 대한 온라인 벤치 마크를 준비했습니다.

    https://jsperf.com/capturing-groups-vs-non-capturing-groups

    (?:hello|bye|ola|cheers)

  • 이전 javascript - jquery 버튼 클릭 이벤트가 시작되지 않음
  • 다음 c++ cli - C ++/CLI Object ^ % (캐럿 퍼센트 부호) 선언은 무엇을 의미합니까?