1

コレクション内のアイテムの非常に高速なルックアップをどのように実装する必要がありますか?

class Person(object):
    __all__ = dict()

    def __init__(self, _id, name, age):
        self._id = _id
        self.name = name
        self.age = age
        self.__class__.__all__[_id] = self

最年長の5人を取得したいとします。len(Person.__all__)が非常に大きく、この操作を頻繁に行う必要がある場合、ベストプラクティスは何ですか?現在、私のコードの実行には約4時間かかりますが、まだデータセット全体をフィードしていません。

私の現在の考えは、データベースを使用してインデックスを維持できると考えていますが、これはすべてのオブジェクトをRAMに保持するよりも遅いと感じています。(私はすべてのオブジェクトをラムに快適に収めることができます)。

または、Python内で、自動ソートされたリストに基づいたある種のインデックスを持つことができます。したがって、特定の年齢の人を検索する必要がある場合は、そのリストを照会してIDを検索し、それを使用Person.__all__してオブジェクト自体を取得します。

最良の選択肢は何でしょうか?

4

2 に答える 2

1

ディクショナリは、Pythonバージョンのハッシュテーブルであり、(平均して)高速ルックアップを保証します。「最小のk個の要素を見つける」のが速いことを保証するものではありませ。実際、それは遅くなります。これは、口述のすべての人を調べる必要があるためです。

代わりに、ソートされたデータ構造に人を格納する必要があります。それ以降は、最初の(または最後の)5つのエントリを調べて、最も古い人を見つけることができます。

Pythonにはそのような組み込みのデータ構造はありませんが、を提供する、よく使用され、十分にテストされたパッケージがblistありますsorteddict。それらの1つを使用したい。

于 2012-05-07T12:03:41.260 に答える
1

sqliteを使用してインメモリデータベースを作成できます。必要に応じて、後でデータベースをディスクに移動するのは簡単です。

于 2012-05-07T12:08:25.080 に答える