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
とかできちゃうから、専用にコード最適化っての難しいものだなぁ。