唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Pythonで文字列から一部の文字を削除するときの速度比較(replaceとsubとtranslate)

上の記事を読んでtranslate関数で文字の削除ができるというのを初めて知りました。
replace関数やtranslate関数の速度の違いが気になったので適当に実験してみました。

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'から'HOGE'の各文字を削除するのを1000000回繰り返して時間を比べてみました。
文字列から改行や空白などを抜く状況を想定しています。
比較手法は以下の4つ。
ソースコードの概略を示しておきます。

string.replace関数

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.replace('H', '').replace('O', '').replace('G', '').replace('E', '')

re.sub関数

あらかじめ正規表現をコンパイルしておきます。

import re
pattern = re.compile('[HOGE]')
pattern.sub('', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

string.translate関数

string.translate関数の第三引数に削除したい文字を与えます。

'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.translate(None, 'HOGE')

unicode.translate関数

unicode文字列の場合のtranslate関数はstringの場合とは違って、置換前と置換後の文字の辞書を与える必要がある。

公正な比較のため置換用の辞書は先に作っておきました。

delete = {ord(u'H'): None, ord(u'O'): None, ord(u'G'): None, ord(u'E'): None}
u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.translate(delete)

結果

単位は秒。

replace sub translate translate(unicode)
1.06973175857 1.62153048587 0.367705010861 4.5599851082

string.translateが一番速かったです。

unicode.translateは、string.translateに比べてこんなに遅くなったことに驚きました。
replaceやsubもunicodeに対してはこれぐらい遅くなるのか調べてみました。

replace(unicode) sub(unicode) translate(unicode)
1.15021322724 1.8932557075 4.5599851082

表を見るとreplaceとsubに関してはunicodeにしてもあまり遅くなっていないことがわかります。

比較の変なところや「別の方法を使ったほうがいい」などありましたら、コメントをいただけると嬉しいです。

ソースコードなど

以下のURLで実行結果を確認できます(繰り返し数は異なるが傾向は同じ)。