bool が遅い

む。bool は遅いらしい。

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from timeit import Timer
>>> Timer(stmt = 'bool(b)', setup = 'b = 1').timeit()
0.57295103148584525
>>> Timer(stmt = 'b and True or False', setup = 'b = 1').timeit()
0.28825199850819061
>>> Timer(stmt = 'f(b)', setup = 'b, f = 1, lambda x: x and True or False').timeit()
0.55923532180766244

関数呼び出しのオーバーヘッドが大きいっぽい。ちなみに 「1 and True or False」だと微妙に最適化されるのであまりフェアじゃない。

>>> import dis
>>> dis.dis(compile('1 and True or False', '<string>', 'exec'))
  1           0 LOAD_NAME                0 (True)
              3 JUMP_IF_TRUE             4 (to 10)
              6 POP_TOP
              7 LOAD_NAME                1 (False)
        >>   10 POP_TOP
             11 LOAD_CONST               1 (None)
             14 RETURN_VALUE

で、psyco を使うとどうなるか。

>>> import psyco
>>> psyco.full()
>>> Timer(stmt = 'bool(b)', setup = 'b = 1').timeit()
0.44927721260660292
>>>
>>> Timer(stmt = 'b and True or False', setup = 'b = 1').timeit()
0.025748244539443021
>>> Timer(stmt = 'f(b)', setup = 'b, f = 1, lambda x: x and True or False').timeit()
0.042812145119000888

結局 bool が遅い。
しかし、

bool = int

とか、

__builtins__.bool = int

とかできちゃうから、専用にコード最適化っての難しいものだなぁ。