上の記事を読んで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にしてもあまり遅くなっていないことがわかります。
比較の変なところや「別の方法を使ったほうがいい」などありましたら、コメントをいただけると嬉しいです。