Pythonで文字列分割
Posted by ごうじん, on Wednesday, June 25, 2014 12:45 AM JST
Pythonで文字列分割を実装してみました。
仕様:
文字列を、指定した長さで分割し、リストで返す。 ※strのみ対象とする。
コード:
コメントが多いですが、実質5行で実装完了。def sharding(value, length): """文字列を分割する :type value: str :param value: 文字列 :type length: int :param length: 分割長 :rtype: list :return: 分割後文字列リスト Base64化した文字列を76文字で分割する。 >>> import base64 >>> sharding(base64.b64encode("0" * 100), 76) ['MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw', \ 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA=='] >>> sharding(u"0" * 100, 76) Traceback (most recent call last): ... TypeError """ # strのみ対象とする if not isinstance(value, str): raise TypeError index = [i for i in range(0, len(value), length)] return [value[i:i+length] for i in index]
ポイントは、
- str以外は例外発生。(25,26行目)
- 分割するインデックスを、文字列の長さから算出。(28行目)
- 文字列を分割してリストを作る。(29行目)
timeitによる性能テスト
100文字を2文字分割。10万回呼び出し。3回実行平均。if __name__ == "__main__": import timeit """100文字を2文字ずつに分割""" t = timeit.Timer('sharding("0" * 100, 2)', "from __main__ import sharding") print str(t.timeit(number=10 * 10000))
$ for i in $(seq 3); do echo -n "#$i:"; python sharding.py; done #1:1.05294680595 #2:1.04975008965 #3:1.05395197868
結果、平均 1.05 秒というスコアでした。
※実行環境: MacBook Air 11-inch, Mid 2013 / CPU:1.3Ghz Intel Core i5, MEM:4G / OSX 10.9.3
チューニング
インデックスを作る部分を、さらにリスト内包表記化しました。--- sharding.py.org 2014-06-25 07:35:21.000000000 +0900 +++ sharding.py 2014-06-25 07:35:29.000000000 +0900 @@ -26,8 +26,7 @@ if not isinstance(value, str): raise TypeError - index = [i for i in range(0, len(value), length)] - return [value[i:i+length] for i in index] + return [value[i:i+length] for i in range(0, len(value), length)] if __name__ == "__main__":
$ for i in $(seq 3); do echo -n "#$i:"; python sharding.py; done #1:0.76712679863 #2:0.735022068024 #3:0.759054899216
結果、平均 0.75 秒。約 30% のスピードアップとなりました。
※実行環境: MacBook Air 11-inch, Mid 2013 / CPU:1.3Ghz Intel Core i5, MEM:4G / OSX 10.9.3