source

왜 파이썬 3.4에 비해 파이썬 3.5에서 str.translate가 훨씬 빠릅니까?

lovecheck 2023. 5. 17. 23:17
반응형

왜 파이썬 3.4에 비해 파이썬 3.5에서 str.translate가 훨씬 빠릅니까?

다음을 사용하여 지정된 문자열에서 원하지 않는 문자를 제거하려고 했습니다.text.translate()Python 3.4에서.

최소 코드는 다음과 같습니다.

import sys 
s = 'abcde12345@#@$#%$'
mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$')
print(s.translate(mapper))

예상대로 작동합니다.그러나 Python 3.4와 Python 3.5에서 동일한 프로그램을 실행하면 큰 차이가 있습니다.

타이밍을 계산하는 코드는 다음과 같습니다.

python3 -m timeit -s "import sys;s = 'abcde12345@#@$#%$'*1000 ; mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$'); "   "s.translate(mapper)"

Python 3.4 프로그램은 1.3ms소요되는 반면 Python 3.5의 동일한 프로그램은 26.4μs만 소요됩니다.

Python 3.4와 비교하여 Python 3.5에서 향상된 점은 무엇입니까?

TL;DR - 문제 2118


긴 이야기

조쉬 로젠버그가 발견한 것은str.translate()기능은 에 비해 매우 느립니다.bytes.translate그는 다음과 같은 문제를 제기했습니다.

파이썬 3에서,str.translate()는 일반적으로 최적화가 아닌 성능 비관화입니다.

왜 그랬을까요?str.translate()느리다고요?

의 주된 이유는str.translate()매우 느린 것은 검색이 파이썬 사전에 있었다는 것입니다.

의 사용법maketrans이 문제를 더 악화시켰습니다.유사한 접근 방식을 사용하여 256개 항목의 C 배열을 구축하여 빠른 테이블 검색을 수행합니다.따라서 상위 레벨의 파이썬 사용dict를 만듭니다.str.translate()Python 3.4에서는 매우 느립니다.

지금 무슨 일이 일어났습니까?

첫 번째 접근 방식은 translate_writer라는 작은 패치를 추가하는 것이었지만, 속도 증가는 그다지 만족스럽지 못했습니다.곧 다른 패치 fast_translate를 테스트하여 최대 55%의 속도 향상이라는 매우 좋은 결과를 얻었습니다.

파일에서 볼 수 있는 주요 변경 사항은 Python 사전 조회가 C 수준 조회로 변경되었다는 것입니다.

현재 속도는 다음과 거의 같습니다.bytes

                                unpatched           patched

str.translate                   4.55125927699919    0.7898181750006188
str.translate from bytes trans  1.8910855210015143  0.779950579000797

여기서 작은 참고 사항은 성능 향상이 ASCII 문자열에서만 두드러진다는 것입니다.

J.F.Sebastian이 아래 의견에서 언급했듯이, 3.5 이전에는 ASCII 및 비 ASCII 사례 모두에서 동일한 방식으로 번역이 작동했습니다.그러나 ASCII의 경우는 3.5부터가 훨씬 빠릅니다.

이전의 ASCII와 ASCII가 아닌 ASCII는 거의 동일했지만 이제 성능에 큰 변화가 있습니다.

답변에서 보는 바와 같이 71.6μs에서 2.33μs로 개선될 수 있습니다.

다음 코드는 이를 보여줍니다.

python3.5 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
100000 loops, best of 3: 2.3 usec per loop
python3.5 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 117 usec per loop

python3 -m timeit -s "text = 'm\U0001F602ssissippi'*100; d={'\U0001F602': 'i'}" "text.translate(d)"
10000 loops, best of 3: 91.2 usec per loop
python3 -m timeit -s "text = 'mJssissippi'*100; d=dict(J='i')" "text.translate(d)"
10000 loops, best of 3: 101 usec per loop

결과 표:

         Python 3.4    Python 3.5  
Ascii     91.2          2.3 
Unicode   101           117

언급URL : https://stackoverflow.com/questions/34287893/why-is-str-translate-much-faster-in-python-3-5-compared-to-python-3-4

반응형