2017-06-25 12 views
0

のは、私がPython3.xを使用して、以下の非常に大きな文字列、数GBのサイズで、長さは100億文字があるとしましょう:考えるPython3.x:非常に長い文字列内の文字を置換する最も簡単な方法

string1 = "XYZYXZZXYZZXYZYXYXZYXZYXZYZYZXY.....YY" 

をその長さ、これはすでに+ GBをRAMにロードするのに要します。

私はすべてのAXBY、およびZCと交換する関数を書きたいと思います。私の目標はできるだけ早くこれを作ることです。当然ながら、これも効率的でなければなりません(例えば、私が確信していないいくつかのRAMトレードオフがあるかもしれません)。

私のための最も明白な解決策はstringモジュールとstring.replace()使用することです:

import string 
def replace_characters(input_string): 
    new_string = input_string.replace("X", "A").replace("Y", "B").replace("Z", "C") 
    return new_string 

foo = replace_characters(string1) 
print(foo) 

'ABCBACCABCCABCBABACBACBACBCBCAB...BB' 

を出力し、私は同時にだとして、これは、最も効率的な方法ではありません心配しますこのような大きなデータ構造上で3つの関数を同時に呼び出します。

この大きな文字列の最も効率的なソリューションは何ですか?

+0

現在のパフォーマンスはどのようなものですか?あなたはそれが何らかの形で不満足だと信じる理由がありますか? – wallyk

+0

@wallykそれはclunkyです。私は '.replace()'が最初に文字列全体を通過していると思います。したがって、この関数は、少なくとも3つの一時的な文字列をメモリに保持する3つの関数呼び出しです。ひどく効率的ではありません。 – ShanZhengYang

答えて

5

途中で非常に多くの一時的な文字列を生成しない、よりメモリ効率のよい方法は、str.translateを使用することです。

>>> string1 = "XYZYXZZXYZZXYZYXYXZYXZYXZYZYZXY" 
>>> string1.translate({ord("X"): "A", ord("Y"): "B", ord("Z"): "C"}) 
'ABCBACCABCCABCBABACBACBACBCBCAB' 

これは、1つの(あなたの場合は余分な)文字列を割り当てます。

+0

ああ、これについて知りませんでした。 –

+0

@Coldspeed私は期待している正規表現よりも*ロット*高速でなければなりません! – donkopotamus

+0

Whoah!優れたソリューション – ShanZhengYang

関連する問題