MongoDB python绑定速度比java慢一个数量级



我在mongodb用户列表上问了同样的问题:http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24

我希望这个论坛上的人能有一些见解。。。

我运行了一个简单的实验,比较了使用python和java的游标迭代的性能,发现python的实现速度慢了大约10倍。我希望有人能告诉我,这种差异是否在意料之中,或者我是否在做一些明确的事情python方面效率低下。

基准测试很简单:它执行查询,在光标上迭代,并检查每个文档中的相同字段。在python版本中,我每秒可以检查大约22k个文档。在java版本中,我每秒可以检查大约220k个文档。

我看到了一些关于python性能的类似问题,我接受了这些建议,并确保我使用的是C扩展:

>>> import pymongo 
>>> pymongo.has_c() 
True 
>>> import bson 
>>> bson.has_c() 
True 

最后,我不认为这种差异是由于python和java之间的根本差异造成的,至少在我的测试代码级别上是这样。例如,如果我将查询的文档存储在python列表中,我可以非常快速地迭代该列表。换句话说,这并不是一个低效的python for循环造成的差异。此外,在插入文档时,Java和Python的性能几乎相同。

以下是有关查询的更多详细信息:

  • python和java实现在同一集合上使用相同的查询,并在同一台机器上运行
  • 该收藏包含约2000万份文件
  • 该查询返回大约200万个文档,即我正在检索集合的大约10%
  • 每个文档包含三个简单的字段:一个日期和两个字符串
  • 查询是索引的,对于python和java实现来说,在实际查询中花费的时间可以忽略不计。它是游标迭代,说明了运行时

看看你在谷歌群组上的帖子,这是我的2c:

  1. Python比Java慢。由于Python不是类型化的,它的解释器无法完成所有的Java JIT"魔法",因此它在运行时总是会更慢。

  2. 在谷歌群组线程上,它指出:

"结果中最大的惊喜是Python基准测试插入较短的值时,性能会降低。如果有什么不同的话,我会有相反的结果。相比之下,Java数字是长字符串与短字符串基本相同"。

由于Mongo在写入时的异步行为,这可能会产生误导。当您在Java和Python基准测试中触发这些写操作时,请确保您设置了相同的Write Concern(最好将其设置为SAFE_MODE)。换句话说,如果您没有专门设置任何Write Concern,请确保Python和Java变体中驱动程序的默认值相同。

最新更新