という一言がずーっと枕元でわんわんやってて寝付きが悪かった。
この例はほんとにいいのか?
なーんか最後までループ回っているようにしか思えないし、書き方はすっきりしたけどダメ臭がする。
試そう試そう。
timeitモジュールというやつがあるのでそれを使います。
例によってムダは多そうですが同じ分ムダしてるのでいいか。
想定するケースは、lang_list(ll)の最後尾、つまり優先順位が最下位の「kr」キーで探した場合。
回数指定無しの場合、デフォルトで100万回くるくるやるそうな。
まず昨日書いてたコードの断片: setup=''' ll = ['en','ja','es','fr','it','ru','nl','tw','cn','kr',] a = {} a['kr'] = u"かんこくごでもんく" b = [x for x in ll if x in list(a.keys())][0] ''' t = timeit.Timer(setup) print(t.timeit())
従来こんな感じにしてますコード: setup=''' ll = ['en','ja','es','fr','it','ru','nl','tw','cn','kr',] a = {} a['kr'] = u"かんこくごでもんく" for lang in ll: val = a.get(lang, None) if val: break ''' t = timeit.Timer(setup) print(t.timeit())
結果。
一つ目:15.1518477907
二つ目:5.40611083252
はーぜんぜんだめじゃんね。
探す目当てのキーをja(優先順位2位)にしてみると
一つ目:15.2410155481
二つ目:2.00092106678
あらら。顕著な差。
リストと辞書の定義をしているので、そこのコストはどんくらいかというと、
setup=''' ll = ['en','ja','es','fr','it','ru','nl','tw','cn','kr',] a = {} a['kr'] = u"かんこくごでもんく" ''' t = timeit.Timer(setup) print(t.timeit())
代入部:0.855803181689
鼻毛ですね。
リストくるくるして見つかったらやめる、のほうがマシだった。視認性も良かった。
なーんだー
すっきりはしたんだけど。
One thought on “昨日のコードほんとに速いか?”