2010-06-20 76 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'更快*' – Wolph 2010-06-20 01:46:49

+0

@WoLpH:他正在解決一個稍微不同的問題。他希望「Hello World」(或任何字符串)根據需要重複多次,但不要超過N個字符的長度。與'string * n'不一樣。 – 2010-06-20 01:54:07

+0

@Brian:事實上,在這種情況下,我的問題是無效的:) 我看不到優化這個更遠的選擇。簡單地對它進行基準測試就足夠了。 – Wolph 2010-06-20 02:13:09

回答

3

這可能是稍快:

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

我說「可能」,因爲這在很大程度上取決於典型stringlength!與'Hello World'61,我已經爲此計時(在舊的Mac筆記本電腦上)在1微秒與1.66微秒的時間;與'Hello World'*10061*123,2.08微秒與2.68你的。只需如何快速要求,什麼長度的字符串,以及什麼典型的值length

注意//是「除以截斷」(只是爲了確保它在Python 3和Python 2中都能正常工作;-),儘管堆棧溢出着色的東西好像它是一個註釋標記(就像在C++中一樣)。

+0

這確實加快了它,它必須足夠好。謝謝! – skeggse 2010-06-20 06:14:11

+0

@CMC,不客氣! – 2010-06-20 19:47:55

0

這裏沒有必要做浮點;在舊的Python版本中,只需說「int(length)/ len(string)」,並且在新版本中可以使用「//」運算符。當你得到結果時,你可以加1來確保它足夠長。或者,在幾個附加的費用,你可以更精確,絕不讓初始字符串太長:

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

相反int(math.ceil(float(length)/len(data)))的你可以只使用length/len(data) + 1。這不完全一樣,但也應該工作。

而在試圖加快速度之前,您確定此功能是性能瓶頸嗎?你會每秒鐘撥幾千次?

要找出函數的哪個變體是最快的變體,您應該對它進行剖析,timeit模塊通常在那裏很有用。

0

如果你真的想優化你需要在C中重寫你的函數作爲python的擴展。

你可以找到信息here。 對不起,我是新來的。

+0

儘管「Python」和「速度」並不真的很好地結合在一起,我仍然需要將它保留在python中。 – skeggse 2010-06-20 06:12:49