2

だから私は数日前にPythonでSetsを発見しましたが、多くのことを本当に単純にしているにもかかわらず、Setsが以前は私の頭に浮かんだことがなかったことに驚いています。後で例を示します。

まだはっきりしないことがいくつかあります。ドキュメントによると、セットは反復可能オブジェクトから作成でき、演算子は常に新しいセットを返しますが、すべてのデータをあるセットから別のセットに、そして反復可能オブジェクトから常にコピーしますか?私は多くのデータを処理しており、itertoolsのように動作する集合と集合演算子が欲しいです。したがって、Sets([iterable])はラッパーに似ており、演算子union、intersectionなどは「iSets」を返し、データをコピーしません。私が最終セットを繰り返すと、それらはすべて評価されます。結局、私は本当に「iSet」演算子が欲しいです。

目的: mongoengineを使用してMongoDBを操作します。記事を保存しました。一部はユーザーに関連付けられ、一部は既読としてマークされ、その他はユーザーに表示されます。すべてのデータをロードしないセットでそれらをラップすることは、それらを結合したり、交差させたりするための優れた方法です。明らかに、特別なクエリを作成することはできますが、MongoDBは結合をサポートしていないため、常にそうとは限りません。だから私はPythonで結合を行うことになります。リレーショナルデータベースを使用できることはわかっていますが、それほど頻繁に結合する必要はなく、私の場合はMongoDBの利点がそれらを上回ります。

それで、あなたはどう思いますか?すでにサードパーティのモジュールはありますか?itertoolsとSetsを組み合わせた数行でうまくいくでしょうか?

編集: それは明らかに正しいので、私はMartijnPietersによる答えを受け入れました。結局、IDのみをセットにロードしてそれらを操作することになりました。また、Pythonのセットの実行時間はかなり良好です。

4

1 に答える 1

4

dictセットはとのようlistです; 作成時に、シード反復可能から参照をコピーします。

セットの一意性要件を強制できないため、イテレータセットにすることはできません。イテレータによって生成される将来の値が以前に確認されているかどうかを知ることはできません。

さらに、2つの反復可能オブジェクト間の交差を判別するには、これらの反復可能変数の少なくとも1つからすべてのデータをロードして、一致するものがあるかどうかを確認する必要があります2番目の反復可能アイテムの各アイテムについて、そのアイテムが最初の反復可能オブジェクトで表示されたかどうかをテストする必要があります。これを効率的に行うには、最初の反復可能ファイルからセットにすべてのアイテムをロードする必要があります。別の方法は、最初の反復可能ファイルを最初から最後までループして、2番目の反復可能ファイルの各アイテムをループし、パフォーマンスを指数関数的に低下させることです。

于 2012-11-13T10:22:13.243 に答える