2012-06-20 12 views
5

私は整数のキーとリストの値を持つ辞書を含むクラスを構築しています。このディクショナリに値を追加することは本当のボトルネックに思えますし、自分のコードをスピードアップする方法があるかどうかは疑問でした。Python:リストの値で辞書に追加する最適な方法

class myClass(): 

    def __init__(self): 
    self.d = defaultdict(list) 

    def addValue(self, index, value): 
    self.d[index].append(value) 

これは本当にこれを行う最適な方法ですか?私は本当に値の順序を気にしないので、より適切なデータ構造があり、そこにはより速い追加があります。そして、もう一度、 'append'が主な問題ではないようです。なぜなら、単に空のリストに追加すれば、コードはずっと速くなるからです。私はそれが時間のほとんどを占める以前に格納されたリストの読み込みだと思いますか?


私は(私は私のオリジナルのポスト、そのために私は謝罪では他に主張が)問題は辞書ではありませんが、リストはappendであることが分かりました。この問題は、Pythonのガベージコレクタのバグが原因で発生しています。これについては、 this other questionでよく説明されています。すべての値を追加してから再度有効にする前にgcを無効にすると、プロセスが大幅にスピードアップします!

+2

リストにアイテムを追加したり、オブジェクトやディクショナリから値を取得するのに時間がかかりません。プログラムをスピードアップするためには、ランダムなコードを変更するのではなく、プロファイリングによってボトルネックを見つけます。 –

+0

新しいキーに値を追加するよりも、既存のキーに項目をマッピングする方がはるかに高速ですか? –

+0

私はちょうどその問題がdictではなく、リストに追加されていることを知った(私は元の投稿では別に主張したが、私はそれを謝る)。それから私は私の質問への答えをhttp://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slowerで見つけました。私はこのサイトを初めて利用しているので、この場合の標準的な手順は何か分かりません。オリジナルの投稿を削除する必要がありますか?または上記の詳細を追加し、投稿に答えますか? – niefpaarschoenen

答えて

0

結論として、元の質問のコードは他のすべての提案より速く、または速いと言えるでしょう。

2

はこれにそれを比較します

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    self.d.setdefault(index, []).append(value) 
+1

好奇心のために、なぜこれはより速いのですか?私は 'defaultdict'がシーンの背後で非常に似通っていると思っていたでしょう。 –

+1

短いテストの後、私はこれがより速くないことを発見しました。私はそれがより好きです。 – eumiro

+0

私はそれが実際には背後で同じことをすると思います。どのような場合でもタイミングは似ています...私はデフォルトの方が好きですが、一般的にはlessをタイプする必要があります。 – niefpaarschoenen

1

彼らは「許可のためよりも、許しを求めるために良い。」と言います。今あなたは個人的に許可を求めていませんが、おそらくdefaultdictと思っていました。

tryこの:

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    try: 
     self.d[index].append(value) 
    except KeyError: 
     self.d[index] = [value] 

これは、それがKeyErrorを上げ、それに基づいて行動しますが存在しない場合は、辞書にindexキーにアクセスしようとします。

それ以上ですか?

+0

あなたのコードとコードを質問から比較しようとしました([timeit](http://docs.python.org/library/timeit.html)を使用しています)。私はこのテストを使用しました: 'my = myClass() my.addValue(3、" ab ") my.addValue(3、" cd ") my.addValue(4、" ef ") my.addValue (4、 "gh") 'そして、元のコードは高速です!私のマシンでは、あなたのコードは24.66マイクロ秒、問題のコードは18.10マイクロ秒です。このアプローチは答えではないように見える。 – stalk

+1

あなたは最も速い解決策を持っているようです:) – jadkik94

関連する問題