Python で cat | grep | wc -l を真似てみるテスト

cat クラスをコンベンションに従って書き換えていかないと機能強化できないのがいけてない.

from __future__ import with_statement
from re import compile

class cat(object):
    def __init__(self, filename):
        def _cat(filename):
            with open(filename) as f:
                for s in f:
                    yield s.rstrip('\r\n')
        self.prev = _cat(filename)

    def grep(self, pattern):
        prev = self.prev
        def _grep(re):
            p = compile(re)
            for s in prev:
                if p.search(s):
                    yield s
        self.prev = _grep(re)
        return self

    def wc_l(self):
        result = 0
        for s in self.prev:
            result += 1
        return result

print cat('access.log').grep('POST').wc_l()

テスト

$ time ./test.py
25775

real    0m12.120s
user    0m11.342s
sys     0m0.749s

$ time grep 'POST' access.log | wc -l
25775

real    0m1.181s
user    0m0.747s
sys     0m0.545s

おけーい.