2017-10-10 54 views
-2

我有一個名爲indexes的大列表。列表中的每個項目都是一個包含2個整數的元組。整數表示我想要連接成一個較大字符串的一系列子字符串的開始和結束索引。Python - 結合一系列字符串的最快方法

例如,如果indexes列表只有2個條目看起來像這樣:[(1, 5), (10,15)]我想有一個輸出字符串,它包含索引位置1和5之間的字符以及索引位置10-15之間的字符。 IE將這兩個切片連接在一起。

爲了更具體一點 - 我的主要字符串實際上是大量十六進制值的字符串版本。我將最終將我的最終字符串轉換回二進制版本,然後將其寫入文件。目前,我的過程是對大數據集很慢,看起來像這樣:

def combineFrames(indexes, largeString): 
    ''' 
    input1 = list of all indexes for start/end of substring 
    input2 = the larger String from which the substrings are being pulled 

    returns a single string that consists of all substrings concatenated together... 

    function also generates a new file that consists of the binary version of the concatenated substrings 
    ''' 

    final_string = "" 

    for seq in indexes: 
     final_string += hexString[seq[0]:seq[1]] 

    fullFile = binascii.unhexlify(final_string) 

    with open("d:\\output_File", 'wb') as f: 
     f.write(fullFile) 

    return fullFile 

目前上述實在是太慢了,我懷疑有一種方法來加速這一過程。思考?

+1

「很慢」有多慢?對於什麼尺寸的輸入?速度有多快會足夠快?你有沒有分析過這些? – pvg

+0

我是一個總編程的noob - 只有在這個幾個月,所以我不知道任何其他選項或如何剖析這個...這個問題是張貼的,因爲一個假設,遍歷每個索引可能不是處理它的最好方法,在搜索過程中我找不到其他方法。有沒有更好的方法可以提出這個問題(僅供將來參考) – occvtech

+0

大部分情況下都是通過嘗試自己回答這些問題 - 現在運行速度有多快?什麼是輸入的大小/類型?目標是什麼?分析可以幫助識別佔用時間的代碼部分(一個更長的話題,你可以谷歌了),但最初,只是測量所用時間是一個好的開始。另一個好的做法是簡要描述你正在解決的一般問題,因爲有時候完全不同的整體優化方法。一般來說,對於任何與績效相關的工作,無論是否存在[SO]問題,更具體的測量和目標越好。 – pvg

回答

4

使用join通常是一種很好的連接字符串的方法。可能看起來是這樣的:

final_string = "".join(hexString[seq[0]:seq[1]] for seq in indexes) 
+0

這比我迭代每個切片的方式快得多。非常感謝你。現在我可以去閱讀一下關於連接方法的內容了:) – occvtech

1

"".join的方法,因爲:

'。加入通常比使用+好,因爲像 「A」 + 「B」 + 「C」也會創建中間字符串「ab」,並且只有 然後是「abc」,而''.join(['a','b','c'])會直接創建 'abc'。使用更少的內存,更快。

相關問題