2012-08-02 3 views
2

textwrap.wrap()textwrap.fill()의 속도가 느린 이유는 무엇입니까? 예를 들어, 랩탑에 10000 자의 문자열을 감싸는 데는 거의 2 초 30 초가 걸립니다.왜 textwrap.wrap() 및 textwrap.fill()이 느린가요?

$ python -m timeit -n 10 -s 's = "A" * 10000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 2.41 sec per loop 

textwrap보다 빠르게 크기의 텍스트 주문을 래핑 an answer to a related Stack Overflow question

#!/usr/bin/env python 
# simplewrap.py 
def fill(text, width=70): 
    return '\n'.join(text[i:i+width] for i in 
        range(0, len(text), width)) 

에서 적응이 코드에 그 비교 :

$ python -m timeit -n 10 -s 's = "A" * 10000; import simplewrap' 'simplewrap.fill(s)' 
10 loops, best of 3: 37.2 usec per loop 
+1

을 스크립트는 지원하며 간단한 코드는 문자열을 길이가 70 인 배열로 맹목적으로 나눕니다. – hamstergene

답변

6

textwrap 무엇보다 많은 이상을 수행하여 간단하고 간소화 된 예제 프로그램이 있습니다. 새로운 클래스를 생성하고 모든 종류의 공백 및 기타 랩 가능 문자 조합을 처리 할 정규 표현식을 컴파일합니다.

따옴표 붙은 프로그램 은 실제로 랩핑하지 않기 때문에 실제로는 공정한 비교가 아닙니다 텍스트

7

코드를 프로파일 링하면 입력을 단어로 나눌 수있는 정규 표현식으로 시간이 걸린다는 것을 알 수 있습니다. 같은 문제를 전시하고 그것의 버전을 박탈은 다음과 같습니다

import re 
s = "A" * 10000 
wordsep_re = re.compile(
    r'\w+[^\W]-' 
    ) 
wordsep_re.split(s) 

내가 파이썬은 정규 표현식을 일치하도록 재귀 되돌아을 사용 믿습니다. 무슨 일이 벌어 지는지는 파이썬이 일치를 시도하고 실패했기 때문에 백업해야한다는 것입니다.

당신은 사용할 수 있습니다 : 당신이 찾을 수

textwrap.fill(s, break_on_hyphens = False) 

정말 빠릅니다. 일치하는 하이픈에 대한 정규식은 텍스트에 공백이없는 경우 병적 인 경우가 있습니다.

2

특정 병리학 적 사례를 테스트하고 있습니다. 하나, nonbreakable 문자열이 몹시 수행 아홉 개 문자 각각의

~: python -m timeit -n 10 -s 's = "A"*10000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 1.62 sec per loop 

그러나 1000 단어를 공백으로 구분하여, 300 배 빠른 실행 : 아마 비 라틴어의 많은 단어를 래핑 TextWrap

~: python -m timeit -n 10 -s 's = "AAAAAAAAA " * 1000; import textwrap' 'textwrap.fill(s)' 
10 loops, best of 3: 5.46 msec per loop 
관련 문제