wsgirefを見て気になったコード

気になった部分があったので、調べてみた。
たぶん、メソッドディスパッチのコストを下げるためのもの。
似たようなベンチマークを書いて速度図ってみた。

class A(object):
    def _write(self, ys):
        raise NotImplementedError

from StringIO import StringIO
io = StringIO()

class B(A):
    def _write(self, s):
        io.write(s)
        self._write  = io.write

class C(A):
    def _write(self, s):
        io.write(s)

import time
class Bench(object):
    target_cls = None

    @classmethod
    def run(cls, N):
        target = cls.target_cls()
        for i in xrange(N):
            target._write("foo")

    @classmethod
    def bench(cls, N):
        start = time.time()
        cls.run(N)
        end = time.time()
        print "Start:",start, "   End:", end
        print "ExecTime:",end-start 
        
class BBench(Bench):
    target_cls = B

class CBench(Bench):
    target_cls = C

N = 1000000
BBench.bench(N)
CBench.bench(N)
BBench.bench(N)
CBench.bench(N)

# Start: 1304342923.02    End: 1304342924.42
# ExecTime: 1.40685200691
# Start: 1304342924.42    End: 1304342926.15
# ExecTime: 1.72291111946
# Start: 1304342926.15    End: 1304342927.56
# ExecTime: 1.41061210632
# Start: 1304342927.56    End: 1304342929.26
# ExecTime: 1.70022082329

どうやらそういうことらしい。
本当にパフォーマンスが重要なとき以外必要ないことかも