2017-10-10 3 views
-2

私はindexesと呼ばれる大きなリストを持っています。リストの各項目は、2つの整数を含むタプルです。整数は、1つの大きな文字列に連結したい一連の部分文字列の開始と終了のインデックスを示します。Python - 一連の文字列を結合する最速の方法

たとえば、indexesのリストには、次のような2つのエントリしかないとします。[(1, 5), (10,15)]インデックス位置1〜5の文字とインデックス位置10〜15の文字で構成される出力文字列が必要です。 ..これらの2つのスライスを連結したIE。

もう少し具体的には、私のメインストリングは、実際には、多数の16進値の文字列バージョンです。私は最終的に私の最終的な文字列をバイナリバージョンに変換してからファイルに書き出します。現在、私のプロセスは、大規模なデータセットに本当に遅いですし、次のようになります。

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

私はコーディングで全部の騒ぎです - これは数ヶ月間しかありませんでしたので、他のオプションやこれをどのようにプロファイルするのか分かりません...質問は、索引はおそらくそれを処理する最良の方法ではなく、検索中に他の方法を見つけることができませんでした。質問をした方が良い方法はありますか(あとで参照するために) – occvtech

+0

これらの質問のうちのいくつかを自分で解決しようとしています。入力のサイズ/タイプは何ですか?目標は何ですか?プロファイリングはコードの部分を特定するのに役立ちますが、時間がかかります(より長い話題)。最初は経過時間を測定するだけで良いスタートです。もう1つの良い方法は、全体的に最適化の方法が全く異なる場合があるため、解決している一般的な問題を簡単に説明することです。一般的に、パフォーマンスに関連する作業については、質問の有無にかかわらず、より具体的な測定値と目標、より良い。 – pvg

答えて

4

joinを使用すると、通常、そのような文字列を連結するのに非常に適しています。

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

これは、各スライスを反復処理する方法よりも非常に高速です。どうもありがとうございました。私の時間は、今すぐ参加メソッドについてのいくつかの読書を行う:) – occvtech

1

あなた"".join方法理由:

'' .joinは、通常は+を使用するよりも優れているので、 "" + "B" + "C" のようなものでしたが、このようになります仲介文字列 "ab"を作成し、 "abc"、 "'.join([' a '、' b '、' c '])は直接 ' abc 'を作成します。より少ないメモリを使用し、高速です。

関連する問題