2011-04-07
リニアサーチとバイナリサーチ
リニアサーチとバイナリサーチは、一般にはバイナリサーチの方が速いわけだけど、RubyとかPythonみないな、速くはない言語でどれほど変わるのだろうかと思う。
普通に想像すると、バイナリサーチのほうが速いといっても、0.00001と0.00005秒の差みたいな物なんだろう。
リニアサーチに比べてバイナリサーチはロジックが若干面倒(リニアサーチがシンプルすぎというべきな気もするが)なので、シンプルにリニアサーチしようとおもったら、Python には bisect (http://www.python.jp/doc/2.5/lib/module-bisect.html)という二分探索アルゴリズムのモジュールがあるらしい*1。というわけで、ベンチとってみた。
import timeit setup1 = ''' DATA = range(1000) ''' setup2 = ''' DATA = range(1000) import bisect ''' bench2 = ''' bisect.bisect_left(DATA, 500) ''' bench1 = ''' for value in DATA: if 500 <= value: break ''' if __name__ == '__main__': print timeit.Timer(bench2, setup2).repeat(3, 100000) print timeit.Timer(bench1, setup1).repeat(3, 100000)
1000個の要素から500を探すという、バイナリサーチに有利な比較。
バイナリ [0.090467929840087891, 0.089236974716186523, 0.089040040969848633] リニア [3.5519189834594727, 3.5491249561309814, 3.5511660575866699]
まぁ、当然ですね。
次は1000個の要素から7を探すという、リニアリサーチが得意な比較。
バイナリ [0.099443912506103516, 0.099334001541137695, 0.099302053451538086] リニア [0.074399948120117188, 0.074351787567138672, 0.074512004852294922]
リニアサーチがぎりぎり逃げ切った。まぁ、比較(ループ)回数はほぼ同じだから普通かな。
最後は1000個の要素から993を探すという、リニアサーチが不得意な比較。
バイナリ[0.094233989715576172, 0.094151020050048828, 0.094120025634765625] リニア[7.0629780292510986, 6.9660470485687256, 6.9703299999237061]
バイナリサーチは要素が多ければ多いほど利点が出てくるのだけど、1000個という小数でもコンスタントに速い。
モジュール呼ぶだけなので、コードもシンプル。というわけで、0.00001と0.00005秒の差みたいなもんだろうけど、実装が難しくないので、ソートされたデータの探索なら bisect 使うのもありだなーと思ったりしました。
*1:ちなみに、bisectはぴゅあパイソンモジュールだよ
トラックバック - http://d.hatena.ne.jp/MER/20110407/1302109296
リンク元
- 73 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331105801955&ved=0CC4QFjAB&url=http://d.hatena.ne.jp/MER/20110305/1299321100&ei=7g9XT6CkKrDDmQWIsfzEDw&usg=AFQjCNG6aLyvJlMBWPBWGRYrLVL_ay9LOQ&sig2=47ff8Yqom2Co9JVUDSzQPg
- 66 http://www.google.co.jp/url?sa=t&rct=j&q=python バージョン 切り替え&source=web&cd=2&ved=0CCUQFjAB&url=http://d.hatena.ne.jp/MER/20110205/1296902809&ei=G0qiTuGgG6XJmAX_1bSZCQ&us
- 46 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDEQFjAA&url=http://d.hatena.ne.jp/MER/20110205/1296902809&ei=1vVFT8b9IanQmAXX5fiiDg&usg=AFQjCNEPRfmgELdbggMTtZ6akJa8Z7CfUw&sig2=jpdPw5Qh39JSxHvfqGEdmQ
- 32 http://www.google.co.jp/url?sa=t&rct=j&q=python uuid&source=web&cd=5&ved=0CEAQFjAE&url=http://d.hatena.ne.jp/MER/20110213/1297538016&ei=GeSiTumPO-edmQWl7emfCQ&usg=AFQjCNFUGOWBI0aNU6uj9DNfYrJ5D5Glsw&sig2=3FuELaLqrFmP7SFfsKVyPA
- 30 http://www.google.co.jp/url?sa=t&rct=j&q=virtualenv python バージョン&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/MER/20110205/1296902809&ei=13y6TpP5FbGNmQXMoK3tBw&usg=AFQjCNEPRfmgELdbggMTtZ6a
- 26 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331164910012&ved=0CEQQFjAD&url=http://d.hatena.ne.jp/MER/20110205/1296902809&ei=6PZXT67sN8vnmAWqz9m_Dw&usg=AFQjCNEPRfmgELdbggMTtZ6akJa8Z7CfUw
- 24 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=python+バージョン切り替え
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1331634564508&ved=0CDcQFjAC&url=http://d.hatena.ne.jp/MER/20110126/1296053652&ei=-CBfT46KPIagiQe5-LTaBw&usg=AFQjCNHeINNWJa35gyjhQZMDEPOKW-RoFQ
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=python 切り替え&source=web&cd=2&ved=0CC4QFjAB&url=http://d.hatena.ne.jp/MER/20110205/1296902809&ei=jxyETtKDNOPemAWJt832Dw&usg=AFQjCNEPRfmgELdbggMTtZ6akJa8Z7CfUw&sig2=cjtx53
- 22 http://www.google.co.jp/search?client=ubuntu&channel=fs&q=AuthDigestDomain&ie=utf-8&oe=utf-8&hl=ja
