ディクショナリにキーを継続的に追加および削除する場合は、問題に適切なデータ構造を使用するものが本当に必要です。ハッシュテーブル(またはSortedOrderedDict
-typeレシピの場合のように、ハッシュテーブルとリスト)ではなく、バランスの取れたツリー(またはスキップリストのような同等のもの)。
PyPIを見回すと、いくつかのオプションが見つかります。私の推薦はですblist
。そのデータ構造は他のいくつかほど最適ではないかもしれませんが(B +ツリーはバイナリツリーよりもはるかに広いため)、遭遇するほとんどすべてのユースケースにはおそらく十分です。また、十分にテストされたパフォーマンス保証を含む、完全で十分にテストされたインターフェースを備えています。そして、それは他の深刻なプロジェクトによってかなり使用されています。
ツリーのパフォーマンスが本当に重要であるまれなケースの1つを扱っている場合は、さまざまな赤黒木、スプレーツリー、スキップリストなどの実装を確認する必要があります。私はbintrees
以前に使用しましたが、これは優れたインターフェイスを備えています(たとえば、インデックスでキーと値にアクセスでき、ツリーをスライスしたり、ツリーをのように扱ったりすることもできます。作成dict
者は、考えられるすべてのあいまいさを熟考して回避しました。 )、しかし私はそれを真剣にパフォーマンステストしていません。
または、キーと値が実際にはすべて小さい整数である場合は、Cythonを使用してC++map<int, int>
をPythonicインターフェイスでラップすることを検討することをお勧めします。( C ++の上に完全なインターフェイスを提供することは完全にmap
は不可能ですが、とにかくそれを必要としないことがよくあります。)または、代わりに、保存して比較するように実装の1つを変更しbintrees.FastRBTree
ます。long
PyObject*
一方、辞書を一度に作成して使用する場合は、はるかに簡単な答えがあります。並べ替えて、に貼り付けOrderedDict
ます。そうすれば、stdlibの外には何も必要ありません。
sorted_dict = collections.OrderedDict(sorted(d.iteritems()))
別の回答へのコメントから、「新しいモジュールをインストールする権限がありません...」と言います。
まず、それが本当に真実であることを確認してください。おそらく、ユーザーのsite-packagesディレクトリにモジュールをインストールする権限があります。または、virtualenv
がインストールされているか、組み込みの3.3を使用している場合はvenv
、さらに良いことに、venvを作成してそれにモジュールをインストールする権限があります。
blist
ただし、その場合は、ファイルを// bintrees
whateverからプロジェクトにコピーする必要があります。
遭遇する可能性のある問題は、これらのパッケージのほとんどにC拡張モジュールが含まれていることです。つまり、それらをビルドできる必要があります(まあ、build_ext -i
それら)。システムにPython開発ファイルとコンパイラツールチェーンがインストールされていない場合、それを行うことはできません。その場合、あなたは最高の純粋なPythonソリューションを探しています。bintrees
遅いことを除いて、通常のC-extension実装と同じ純粋なPython実装が付属しています。もちろん、それでもO(log N)ですが、定数係数の方がはるかに高くなります。Nが十分に大きい場合でも、それは大きな勝利です。そうでない場合は、そうではない可能性があります。
これのいずれかの部分が合理的に聞こえるが、ユーザーごとのサイトパッケージまたは仮想環境のセットアップ、プロジェクトへのモジュールのインプレースでのコピー、拡張機能のインプレースでの構築などの支援が必要な場合は、おそらく検索する必要があります既存の質問については、新しい質問が見つからない場合は質問してください(インストールの問題の専門家である種類の人々が必ずしもデータ構造の専門家であるとは限らず、これを読んでいない可能性があるためです。質問)。