ほとんどの場合、パフォーマンスヒット(通常は衝突時に発生)は、すべての呼び出しで償却されます。したがって、最も現実的な使用法では、O(n)
すべての呼び出しに対応することはできません。実際、すべての呼び出しでヒットが発生する唯一のケースはO(n)
、すべてのキーのハッシュが既存のキーのハッシュ値と衝突する病理学的ケースです(つまり、ハッシュテーブルの可能な限り最悪の(または最も不幸な)使用法)。
たとえば、キーのセットを事前に知っていて、それらにハッシュ衝突がないことがわかっている場合(つまり、すべてのハッシュが一意である場合)、衝突のケースに悩まされることはありません。他の主要なO(n)
操作はハッシュテーブルのサイズ変更ですが、これの頻度は実装(拡張係数/ハッシュ関数/衝突解決スキームなど)に依存し、入力セットに応じて実行ごとに異なります。
いずれの場合も、すべてのキーをdictに事前入力できれば、実行時の突然の速度低下を回避できます。値はNoneに設定するだけで、後で実際の値を入力できます。これにより、最初にキーでdictを「プライミング」するときに、唯一の顕著なパフォーマンスヒットが発生するはずであり、将来の値の挿入は一定の時間である必要があります。
まったく別の質問は、構造をどのように読み取ったり照会したりするつもりなのかということです。個別の値を添付し、キーを介してそれらにアクセスする必要がありますか?注文する必要がありますか?マッピングは実際には必要ないため、おそらくaset
よりも適切な場合があります。dict
key:value
アップデート:
コメントの説明に基づくと、一時的なセットを使用している場合でも、これはデータベースが実行する作業のように聞こえ始めています。インメモリリレーショナルデータベースを使用できます(SQLiteなど)。さらに、SQLAlchemyのようなORMを使用して、SQLを記述せずに、よりPython的にデータベースと対話できます。
そもそもデータベースからデータを読み取っているように聞こえますが、それをさらに活用できるのではないでしょうか。
一意にキー設定された大量の型付きレコードの保存/クエリ/更新は、まさにRDBMSが何十年にもわたる開発と研究に特化してきたことです。既存のリレーショナルデータベース(SQLiteなど)のインメモリバージョンを使用することは、おそらくより実用的で持続可能な選択になるでしょう。
Pythonの組み込みsqlite3
モジュールを使用してみて":memory:"
、構築時にdbファイルパスとして提供することにより、メモリ内バージョンを試してください。
con = sqlite3.connect(":memory:")