왜 파이썬 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
'source' 카테고리의 다른 글
ng-filename : 단일 필드로 필터링 (0) | 2023.05.17 |
---|---|
PostgreSQL에서 테이블을 만들 때 열에 주석을 추가하시겠습니까? (0) | 2023.05.17 |
.NET에서 시간 전용 값을 어떻게 표시합니까? (0) | 2023.05.17 |
포맷 시간 범위가 24시간보다 큼 (0) | 2023.05.17 |
iOS11/Xcode 9에서 TIC 읽기 상태 1:57은 무엇입니까? (0) | 2023.05.17 |