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

时间:2012-03-30 22:51:26

标签: mongodb pymongo mongodb-java

我在mongodb-user列表中问了同样的问题: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和java实现在同一个集合上使用相同的查询并在同一台机器上运行。
  • 该集合包含约2000万份文档。
  • 查询返回大约200万个文档,即我正在检索大约10%的集合。
  • 每个文档包含三个简单字段:日期和两个字符串。
  • 查询被编入索引,实际查询所花费的时间对于python和java实现都是微不足道的。它是考虑运行时的游标迭代。

1 个答案:

答案 0 :(得分:2)

好好查看Google网上论坛上的帖子,这是我的2c:

  1. Python比Java慢。由于Python没有输入,它的解释器无法完成所有Java JIT的“魔术”,因此它在运行时总是会变慢。

  2. 在Google网上论坛帖子中声明:

  3. “结果的大惊喜是Python基准测试 当我插入较短的值时,性能降级。如果有的话,我 本来预料到了相反的结果。相比之下,Java数字是 对于长字符串和短字符串基本相同“。

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