simudaru's blog

Python, Rなどのメモを残していこうと思います。  よろしくお願いいたします。

【python】辞書型のループ処理

はじめてのPythonを今更ながらちゃんと読んでいる。

辞書型で全てのキーに対して処理をする際、以下のようにkeysメソッドを用いていた。

def dictionary_loop1(dic):
    ans = 0
    for k in dic.keys():
        ans += k
    return ans


しかし辞書型にはイテレータが定義されているため、keysメソッドを使わなくとも良い。

def dictionary_loop2(dic):
    ans = 0
    for k in dic:
        ans += k
    return ans


この方がシンプルだし、実行速度も多少速い。

a = range(10000)
b = [10000 * x for x in a]
dic = dict(zip(a, b))

# with ipython notebook
%timeit dictionary_loop1(dic)
%timeit dictionary_loop2(dic)
1000 loops, best of 3: 505 µs per loop
1000 loops, best of 3: 483 µs per loop

ついでに、valueを必要とするループも試してみた。

def dictionary_value_loop1(dic):
    ans = 0
    for v in dic.values():
        ans += v
    return ans

def dictionary_value_loop2(dic):
    ans = 0
    for k in dic:
        ans += dic[k]
    return ans

# with ipython notebook
%timeit dictionary_value_loop1(dic)
%timeit dictionary_value_loop2(dic)
1000 loops, best of 3: 1.28 ms per loop
1000 loops, best of 3: 1.55 ms per loop

この場合はvaluesメソッドで一気に値を取得したほうが速いようだ。


key-value両方が必要な処理ではどうか。

def dictionary_key_value_loop1(dic):
    ans = [0]*2
    for k, v in dic.items():
        ans[0] += k
        ans[1] += v
    return ans

def dictionary_key_value_loop2(dic):
    ans = [0]*2
    for k in dic:
        ans[0] += k
        ans[1] += dic[k]
    return ans

# with ipython notebook
%timeit dictionary_key_value_loop1(dic)
%timeit dictionary_key_value_loop2(dic)
100 loops, best of 3: 4.34 ms per loop
100 loops, best of 3: 4.49 ms per loop

これもitemsメソッドを用いたほうが速いようだ。