Google Sitemaps用XML自動生成ツール

Pythonで文字列分割

Posted by ごうじん, on Wednesday, June 25, 2014 12:45 AM JST
Python 2.7.9

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]

ポイントは、

  1. str以外は例外発生。(25,26行目)
  2. 分割するインデックスを、文字列の長さから算出。(28行目)
  3. 文字列を分割してリストを作る。(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



 amazon affiliate