5

私は、とりわけ整数キーとリスト値を持つ辞書を使用してクラスを構築しています。ただし、この辞書に値を追加することは実際のボトルネックのようであり、コードを高速化する方法があるのではないかと考えていました。

class myClass():

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

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

これは本当にこれを行うための最適な方法ですか?値の順序はあまり気にしないので、おそらく、より高速な追加を備えた、より適切なデータ構造があります。繰り返しになりますが、「追加」は主な問題ではないようです。空のリストに追加するだけで、コードがはるかに高速になるためです。ほとんどの時間を占めるのは、以前に保存されたリストのロードだと思いますか?


問題は口述ではなく、リストの付録にあることがわかりました(ただし、元の投稿で別の方法で主張しましたが、申し訳ありません)。この問題は、Pythonのガベージコレクターのバグが原因です。これは、この他の質問で十分に説明されています。すべての値を追加する前にgcを無効にしてから再度有効にすると、プロセスが大幅に高速化されます。

4

3 に答える 3

2

これと比較してください:

class myClass():

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

  def addValue(self, index, value):
    self.d.setdefault(index, []).append(value)
于 2012-06-20T12:00:01.533 に答える
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]

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

もっと速いですか?

于 2012-06-20T12:22:25.540 に答える
0

結論として、元の質問の私のコードは、他のすべての提案よりも速いか、同じくらい速いと言えます。

于 2014-02-06T08:28:15.547 に答える