programing tip

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

itbloger 2020. 7. 20. 07:48
반응형

왜 파이썬 3.5에서 파이썬 3.4에 비해 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사용 합니다.

파이썬 3.5에서 파이썬 3.4에 비해 더 빨라진 개선점은 무엇입니까?


TL; DR- 문제 21118


긴 이야기

조쉬 로젠버그는 것을 알아 냈다 str.translate()기능이 매우 느린과 비교 bytes.translate, 그는 인상 문제를 그 진술 :

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

str.translate()느렸습니까?

str.translate()매우 느린 주된 이유 는 조회가 Python 사전에 있었기 때문입니다.

사용으로 maketrans인해이 문제가 악화되었습니다. 비슷한 방법을 사용하여 bytes빠른 테이블 조회를 위해 256 개의 항목으로 구성된 C 배열을 작성합니다. 따라서 높은 수준의 Python을 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 문자열에서만 두드러진다는 것입니다.

JFSebastian이 아래 주석 에서 언급했듯이 3.5 이전 버전에서는 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

반응형