2010-06-20 3 views
1

문자열을 가져 와서 문자열의 길이가 x가되도록 반복 할 코드가 있습니다.최적화 : Python 문자열 반복

>>> import math 
>>> def repeat(data, length): 
     return (data * int(math.ceil(float(length)/len(data))))[:length] 
>>> repeat("Hello World", 22) 
'Hello WorldHello World' 
>>> repeat("Hello World", 20) 
'Hello WorldHello Wor' 

최적화 할 방법이 있습니까? 이 작업을 많이 사용해야하므로이 작업을 빠르게 수행해야합니다. 또한 목록과 함께 작동해야합니다.

+0

궁금합니다. 'repeat ("Hello World", 22)''Hello World "보다 빠르다는 것을 실제로 확인하셨습니까 * 22' – Wolph

+0

@WoLpH : 그는 약간 다른 문제를 해결하고 있습니다. 그는 "Hello World"(또는 임의의 문자열)를 필요한만큼 반복하지만 N 문자를 초과하지 않기를 원합니다. 'string * n '과 같지 않습니다. –

+0

@ 브라이언 : 실제로이 경우 제 질문은 유효하지 않습니다. 나는 이것을 훨씬 더 최적화 할 수있는 옵션이 없습니다. 벤치마킹만으로 충분합니다. – Wolph

답변

3

이 소폭 빠를 수 있습니다

def repeat(string, length): 
    L = len(string) 
    return string * (length // L) + string[:length % L] 

는 내가 말할 "수도"많은 전형적인 stringlength에 의존하기 때문에! 'Hello World'61을 사용하여 1 초당 1.66 마이크로 초로 시간을 조정했습니다 (예전 Mac 랩톱에서). 'Hello World'*10061*123, 2.08 마이크로 초 대 2.68 당신을 위해. 어떻게 빨리, 어떤 길이의 문자열에, 그리고 어떤 전형적인 값이 length입니까?

참고 //은 Stack Overflow가 주석 표시 (C++ 에서처럼)로 채색하는 경우에도 "잘라내기로 나누기"입니다 (Python 3 및 Python 2 ;-)에서 제대로 작동하는지 확인하기 위해.

+0

이것은 다소 속도가 빠릅니다. 충분히 좋을 것입니다. 감사! – skeggse

+0

@CMC, 환영합니다! –

0

여기서 부동 소수점을 사용할 필요는 없습니다. 예전의 Python 버전에서는 "int (length)/len (string)"이라고 말하고 새 버전에서는 "//"연산자를 사용할 수 있습니다. 결과를 얻었 으면 1을 더하면 길어질 수 있습니다. 또는, 몇 가지 더 추가의 비용으로, 당신은 더 정확하게 초기 문자열이 너무 오래 할 수 없다 : 당신은 그냥 length/len(data) + 1를 사용할 수

... 
    return (data * ((int(length) + len(data) - 1)/len(data)))[:length] 
0

대신 int(math.ceil(float(length)/len(data)))의. 정확히 동일하지는 않지만 잘 작동해야합니다.

그리고 더 빨리이 기능을 사용하기 전에 성능 병목 현상이 발생 했습니까? 매초마다 몇 천 번이나 부르시겠습니까?

가장 변형이 빠른 함수의 변형을 찾으려면 프로파일을 작성해야합니다. 일반적으로 timeit 모듈이 유용합니다.

0

파이썬의 확장 기능으로 C에서 함수를 다시 작성해야하는 경우 정말로 최적화하고 싶다면.

정보는 here입니다. 영어로 죄송합니다.

+0

"파이썬"과 "속도"가 실제로 잘 어울리지는 않지만 파이썬으로 유지해야합니다. – skeggse