26

私は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の両方の実装でごくわずかです。ランタイムを説明するのはカーソルの反復です。
4

1 に答える 1

2

Google グループでの投稿もよく見てください。ここに私の 2c があります。

  1. Python は Java よりも遅いです。Python は型付けされていないため、そのインタープリターはすべての Java JIT "魔法" を行うことができず、実行時に常に遅くなります。

  2. Google グループのスレッドでは、次のように述べられています。

「結果の大きな驚きは、短い値を挿入するとPython ベンチマークのパフォーマンスがどのように低下​​するかということです。どちらかといえば、逆のことを予想していたでしょう。比較すると、Java の数値は長い文字列と短い文字列で本質的に同じです」.

書き込みに関しては、Mongo の非同期動作のために、これは誤解を招く可能性があります。Java と Python の両方のベンチマークでこれらの書き込みを開始するときは、必ず同じ書き込み懸念を設定してください (できれば SAFE_MODE に設定してください)。つまり、書き込み懸念を特に設定しない場合は、ドライバーのデフォルト値が Python と Java の両方のバリアントで同じであることを確認してください。

于 2012-08-19T22:53:08.293 に答える