전각 전반각 및 그 성능 최적화

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개이기 때문이다. 우리는 이 문자들을 검사하고 교체하는 데 걸리는 시간이 더 짧기 때문이다. 한번 해 볼까?

좋은 웹페이지 즐겨찾기