Pythonで文字列からN文字ずつ取り出すジェネレータのベンチマーク
先日、Pythonで文字列からN文字ずつ取り出すジェネレータを考えてみました。
で、コメントいただいたりして、いくつかやり方がでてきたので、せっかくなのでベンチマークをとってみました。
# coding=utf-8 import StringIO from benchmarker import Benchmarker import itertools text = "a" * 10000 # StringIOのreadを使う def split_text(text, n): if not isinstance(text, unicode): text = text.decode('utf-8') io = StringIO.StringIO(text) while True: s = io.read(n) if s: yield(s) else: break #strのsliceを使う def slice_text(text, n): if not isinstance(text, unicode): text = text.decode('utf-8') for i in range(0, len(text) / n + 1): s = text[i * n:(i + 1) * n] if s: yield(s) else: break #strのsliceとitertools.countを使う def slice_text_with_itertools(text, n): if not isinstance(text, unicode): text = text.decode('utf-8') for i in itertools.count(): s = text[i * n:(i + 1) * n] if s: yield(s) else: break for bm in Benchmarker(width=40, cycle=100, extra=1): for _ in bm('use StringIO'): for l in split_text(text, 2): pass for _ in bm('use slice'): for l in slice_text(text, 2): pass for _ in bm('use slice and itertools.count'): for l in slice_text(text, 2): pass
実行結果
結論
sliceを使うべき。