私はmongodb-userリストでこれと同じ質問をしました:http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24
私はこのフォーラムの誰かがいくつかの洞察を持っているかもしれないことを望んでいました...
PythonとJavaを使用してカーソルの反復のパフォーマンスを比較する簡単な実験を実行したところ、Pythonの実装が約10倍遅いことがわかりました。私は誰かがこの違いが予想されるかどうか、または私がPython側で明らかに非効率的なことをしているのかどうか教えてくれることを望んでいました。
ベンチマークは単純です。クエリを実行し、カーソルを繰り返し処理して、各ドキュメントの同じフィールドを検査します。Pythonバージョンでは、1秒あたり約22kのドキュメントを検査できます。Javaバージョンでは、1秒あたり約22万件のドキュメントを検査できます。
Pythonのパフォーマンスについて同様の質問をいくつか見てきましたが、アドバイスを受けて、C拡張機能を使用していることを確認しました。
>>> import pymongo
>>> pymongo.has_c()
True
>>> import bson
>>> bson.has_c()
True
最後に、この不一致は、少なくとも私のテストコードのレベルでは、PythonとJavaの根本的な違いによるものではないと思います。たとえば、クエリされたドキュメントをPythonリストに保存すると、そのリストをすばやく繰り返すことができます。言い換えれば、違いを説明するのは非効率的なpythonforループではありません。さらに、ドキュメントを挿入すると、JavaとPythonでほぼ同じパフォーマンスが得られます。
クエリの詳細は次のとおりです。
- PythonとJavaの両方の実装は、同じコレクションで同じクエリを使用し、同じマシンで実行されます。
- コレクションには約2000万のドキュメントが含まれています。
- クエリは約200万のドキュメントを返します。つまり、コレクションの約10%を取得しています。
- 各ドキュメントには、日付と2つの文字列の3つの単純なフィールドが含まれています。
- クエリにはインデックスが付けられ、実際のクエリに費やされる時間は、PythonとJavaの両方の実装でごくわずかです。ランタイムを説明するのはカーソルの反復です。