Hatena::Grouppython

easy_install makimoto

 | 

2008-10-01

dict と defaultdict

07:25 |  dict と defaultdict - easy_install makimoto を含むブックマーク はてなブックマーク -  dict と defaultdict - easy_install makimoto

恥しながらつい最近、collections.defaultdict を知りました。*1

Python 2.5 で追加された型なので、 2.4 以前では使えないという問題がありますが、いちいち、 adict.get(hoge,0) などとしなくてもデフォルト値を持っているので凄く便利です。

しかし、defaultdict は 組み込みの dict 型と比較して遅いというコメント *2 があったので、実際どれくらい遅いのか検討していみようと思いまう。

実験設定

単純な単語頻度を数える問題にします。

最近、あたしったーなるケッタイな代物を作る機会があり、「あたし彼女」の形態素分かち書きのデータを作ってたので、せっかくなんでこれの単語頻度を数えます。

まず、こんなコードをでっち上げます。

#!/usr/bin/env python
# vim:fileencoding=utf8
from time import clock
from collections import defaultdict

def timer(func,*args):
  start = clock()
  func(*args)
  return clock() - start

def use_dict_if(aList):
  for i in xrange(3000):
    aDict = {}
    for j in aList:
      if j in aDict: aDict[j] += 1
      else: aDict[j] = 1

def use_dict_get(aList):
  for i in xrange(3000):
    aDict = {}
    for j in aList:
      aDict[j] = aDict.get(j,0) + 1

def use_defaultdict(aList):
  for i in xrange(3000):
    aDDict = defaultdict(int)
    for j in aList:
      aDDict[j] += 1

''' Reading atashi-kanojo terms into aList '''
aList = []
for i in open('atashi.wakati'):
  aList.extend(i.split())

print 'use_dict_if:', timer(use_dict_if, aList)
print 'use_dict_get:', timer(use_dict_get, aList)
print 'use_defaultdict:', timer(use_defaultdict, aList)

ご覧の通り、これは以下の3つの条件で「あたし彼女」の単語頻度のディクショナリを3000回構築する時間を計測します。

  • dict 型で if hoge in adict を使う場合 (use_dict_if)
  • adict.get(hoge,0) を使う場合 (use_dict_get)
  • defaultdict を使う場合の3つの条件 (use_defaultdict)

実験結果

では早速コードを走らせてみた結果を見てみましょう。

% python timer.py
use_dict_if: 65.79
use_dict_get: 82.31
use_defaultdict: 60.38

ということで、use_defaultdict 、 use_dict_if 、 use_dict_get の順に処理時間がかかるという結果になりました。

あまりきっちりとした実験環境で試したわけではないので、厳密なことは言えませんが、 aDict.get を使用した場合が明らかに遅いのと比較して、if 文を使った場合と、 collections.defaultdict 型を使用した場合とに大きな差は見られないばかりか、若干 defaultdict の方が速いみたいです。

結論

collections.defaultdict は便利だし効率面でも悪くないみたいなので、 (互換性さえ気にならなければ) どんどん使った方が良い、かも。

xvutrfakjkyxvutrfakjky 2011/03/15 14:27 iUAH5v <a href="http://daazhhsfvyhl.com/">daazhhsfvyhl</a>, [url=http://dslpvgsikwlm.com/]dslpvgsikwlm[/url], [link=http://qerztfxgsjtj.com/]qerztfxgsjtj[/link], http://oezkhpczwkmb.com/

RajuRaju 2012/09/21 18:04 Thanks for sharing. What a pealsure to read!

qtxlrnnnqefqtxlrnnnqef 2012/09/22 14:07 TjSjAF <a href="http://vqqgppfnxxqx.com/">vqqgppfnxxqx</a>

wvmfszmewvmfszme 2012/09/22 22:01 ZCtcOh , [url=http://rkekdwkpagfe.com/]rkekdwkpagfe[/url], [link=http://aqmkdsebfwyv.com/]aqmkdsebfwyv[/link], http://dwkxwultapig.com/

yfjbskcdjyfjbskcdj 2012/09/23 06:07 pGKotR <a href="http://xookddutvebh.com/">xookddutvebh</a>

iknsadmyziknsadmyz 2012/09/24 21:19 jFjKpa , [url=http://gbtnejistkbk.com/]gbtnejistkbk[/url], [link=http://vtehwttfeijv.com/]vtehwttfeijv[/link], http://cnlvqslyomqw.com/

ゲスト



トラックバック - http://python.g.hatena.ne.jp/makimoto/20081001
 |