2012-05-07 16 views
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__を使ってオブジェクト自体を取得します。

どのようなオプションが最適でしょうか?

+0

4時間? **あなたのDBに多くの人がいる必要があります...真剣に、あなたのコードを見せてください。 – eumiro

+2

ちょうどデータベースに行ってください。 ( 'SELECT * FROM people ORDER BY age DESC LIMIT 5') – plaes

+1

' __ * __ 'は予約されていると確信しています。プライベートプロパティを作成する場合は' __all'を使用してください。 – KurzedMetal

答えて

1

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

1

辞書は、(平均して)高速検索を保証する、ハッシュテーブルのPython版です。 ではなく、の保証は速く「最低でもkの要素を見つける」ということです。実際には、それは遅くなります。なぜなら、あなたは独言のすべての人を見る必要があるからです。

代わりにソート済みのデータ構造に人を格納したい場合は、最初の(または多分最後の)5つのエントリを見て最も古い人を見つけることができるので、データ構造はです。

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

関連する問題