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を使うべき。