文字列結合

str.joinとフォーマット指定の時間をPython 2.5で比較してみた。2.5.1ではテストしていないが恐らく変わらないと思う。

>>> from timeit import Timer
>>>
>>> setup='''
... a = ['a', 2, 3, "b"]
... '''
>>> stmt1 = "'%s'*len(a) % tuple(a)"
>>> stmt2 = "''.join([str(x) for x in a])"
>>>
>>> Timer(stmt1, setup).timeit()  # フォーマット指定版
2.8873306523594482
>>> Timer(stmt2, setup).timeit()  # str.join版
4.8919918593005542
>>>
>>> setup='''
... a = range(40)                 # もう少し大きめのリストでテスト
... '''
>>>
>>> Timer(stmt1, setup).timeit()  # フォーマット指定版
25.632869540681867
>>> Timer(stmt2, setup).timeit()  # str.join版
52.232209959645729

テストが少ないがフォーマット指定はstr.joinに比べて約2倍ぐらい早いと思われる。計算量は恐らく線形的に比例していると思われる。仕事で使う場合は、可読性を考えてstr.join版を使うべきだと思うが、2倍の時間は結構大きい。スクリプトはパフォーマンス最適化を研究しだしたらきりがない。


先日も仕事で旧スタイルクラスを使用した方が新スタイルクラスを使用する場合よりも高速だったが、具体的にどこがネックになっているかまでは追求していない。バージョンアップで事情がまた変わると思うので、姑息な手段を使っているとトータル的に結局損をしそう。細かいパフォーマンスを気にするならそもそもスクリプト言語を使用するなというのが私の考え。