전각 전반각 및 그 성능 최적화
4523 단어 python
신구 2판 코드 비교
레거시 코드
PY2_FLAG = True
def full2half_1(str):
"""
:param str:
:return:
Examples
--------
>>> a = u"Hello word!"
>>> print(full2half_1(a))
Hello word!
"""
def to_half(char):
num = ord(char) # utf-8 16
if num == 0x3000: #
num = 32
elif 0xFF01 <= num <= 0xFF5E: # 93 , 。
num -= 0xfee0
char = unichr(num) if PY2_FLAG else chr(num) # in python 3, ord support as unichr,16 utf-8 。
return char
if not str:
return str
n = [to_half(char) for char in str]
return ''.join(n)
새 코드
def to_char(int):
return unichr(int) if PY2_FLAG else chr(int)
full_half_mapping = {to_char(i): to_char(i - 0xfee0) for i in xrange(0xFF01, 0xFF5E)}
full_half_mapping[to_char(0x3000)] = to_char(32)
def full2half_2(text):
return ''.join([full_half_mapping.get(t, t) for t in text])
테스트 효과
test_str = u" , ksl,。;‘;’【p1230979014795612040askdjkjklwekfioszndmmxcvk"
test_str = test_str * 50
print len(test_str)
# out: 3000
%timeit full2half_1(test_str)
# out: 1000 loops, best of 3: 900 µs per loop
%timeit full2half_2(test_str)
# out: 1000 loops, best of 3: 434 µs per loop
test_str = u" , ksl,。;‘;’【p1230979014795612040askdjkjklwekfioszndmmxcvk"
test_str = test_str * 100
print len(test_str)
# out: 6000
%timeit full2half_1(test_str)
# out: 1000 loops, best of 3: 1.77 ms per loop
%timeit full2half_2(test_str)
# out: 1000 loops, best of 3: 882 µs per loop
결론
새로운 방법은 구판 방법보다 절반의 시간을 절약해야 한다
새 방법의 시간 소모는 O(nO(dict.get) O(n O(d i c t. g e)이며, 이 중 O(dict.get) O(d i c t. g e)는 Python의 dict 유형 get 작업 시간 소모이며, 여기서 dict의 길이는 정해진 값이다.O (dict.get) O (d i c t. g e t)는 O (to half) O (t o h a l f)보다 적은 시간 소모를 가집니다.
전망하다
한층 더 최적화되면 O(n)O(n)에 손을 댈 수 있다.현재 프로그램에서 문자열을 한 번 스캔해야 하지만, 이것은 반드시 필요한 것이 아니다. 왜냐하면 UTF-8 라이브러리에서 중국어 상황에서 전각을 반각으로 돌려야 하는 문자는 모두 94개이기 때문이다. 우리는 이 문자들을 검사하고 교체하는 데 걸리는 시간이 더 짧기 때문이다. 한번 해 볼까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.