という一言がずーっと枕元でわんわんやってて寝付きが悪かった。
この例はほんとにいいのか?
なーんか最後までループ回っているようにしか思えないし、書き方はすっきりしたけどダメ臭がする。
試そう試そう。
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 “昨日のコードほんとに速いか?”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です