파이썬에서 알파벳 문자의 해당 위치를 구하는 여러 가지 방법과 성능 비교
어떤 경우에는 알파벳 문자의 순서인 A = 1, B = 2를 알아내야 합니다. , C = 3 등, 예를 들어 이 질문 https://projecteuler.net/problem=42 문제를 해결하는 단계 중 하나는 문자를 알파벳의 해당 순서로 변환하는 것입니다.
알파벳에서 문자의 해당 위치를 얻는 가장 쉬운 방법은 다음과 같습니다.
str.index 또는 str.find 방법을 사용합니다.
In [137]: "ABC".index('B') Out[137]: 1In [138]: "ABC".index('B')+1Out[138]: 2#或者在前面填充一个字符,这样index就直接得到字母序号: In [139]: "_ABC".index("B") Out[139]: 2
I I 또한 알파벳을 목록이나 튜플로 변환한 다음 이를 인덱싱하는 방법도 생각했습니다. 성능이 향상될 수도 있습니다. 아니면 문자와 숫자로 구성된 키값을 사전에 저장해 두는 것이 좋은 방법일까요?
저는 이틀 전에도 방법을 깨달았습니다.
In [140]: ord('B')-64 Out[140]: 2
ord와 chr은 모두 Python에 내장된 함수입니다. ord는 ASCII 문자를 ASCII Serial의 해당 문자로 변환할 수 있습니다. number, chr은 일련번호를 문자열로 변환할 수 있습니다.
표의 대문자는 65부터 시작하는데, 빼기 64가 바로 표의 대문자 위치입니다. 소문자는 97부터 시작하며, 96보다 작은 문자는 해당 알파벳 위치입니다.
성능 측면에서 어떤 접근 방식이 더 나을까요? 테스트하기 위해 코드를 작성했습니다.
az = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"_az = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"azlist = list(az) azdict = dict(zip(az,range(1,27))) text = az*1000000 #这个是测试数据#str.find和str.index的是一样的。这里就没必要写了。def azindexstr(text): for r in text: az.index(r)+1 passdef _azindexstr(text): for r in text: _az.index(r) passdef azindexlist(text): for r in text: azlist.index(r) passdef azindexdict(text): for r in text: azdict.get(r) passdef azindexdict2(text): for r in text: azdict[r] passdef azord(text): for r in text: ord(r)-64 passdef azand64(text): for r in text: ord(r)%64 pass
위 코드를 복사하여 ipython에 붙여넣은 다음 매직 함수 %timeit를 사용하여 각 메서드의 성능을 테스트합니다. ipython은 주로 텍스트에 사용되는 %timeit 함수와 같이 매우 실용적인 다양한 기능을 제공하는 Python 대화형 인터프리터입니다. pip install ipython을 입력하여 설치하세요.
다음은 제가 테스트한 결과 데이터입니다.
In [147]: %timeit azindexstr(text) 1 loop, best of 3: 9.09 s per loop In [148]: %timeit _azindexstr(text) 1 loop, best of 3: 8.1 s per loop In [149]: %timeit azindexlist(text) 1 loop, best of 3: 17.1 s per loop In [150]: %timeit azindexdict(text) 1 loop, best of 3: 4.54 s per loop In [151]: %timeit azindexdict2(text) 1 loop, best of 3: 1.99 s per loop In [152]: %timeit azord(text) 1 loop, best of 3: 2.94 s per loop In [153]: %timeit azand64(text) 1 loop, best of 3: 4.56 s per loop
결과를 보면 list.index가 가장 느린 것을 알 수 있습니다. 나. 또한 목록에 데이터가 많으면 인덱스 속도가 매우 느려집니다. dict[r]의 속도는 dict.get(r)보다 빠르지만 키가 존재하지 않는 경우 dict[r]은 오류를 보고하고 dict.get 메서드는 오류를 보고하지 않으며 내결함성이 더 좋습니다.
ord(r)-64 방법은 속도가 빠르고 데이터를 구성할 필요가 없기 때문에 사용하기 가장 편리합니다.