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

MongoDB python绑定比java慢一个数量级?,mongodb,pymongo,mongodb-java,Mongodb,Pymongo,Mongodb Java,我在mongodb用户列表上问了同样的问题: 我希望这个论坛上的人能有一些见解 我运行了一个简单的实验,比较了使用python和java的游标迭代的性能,发现python实现要慢10倍左右。我希望有人能告诉我,这种差异是意料之中的,还是我正在做一些明确的事情 python方面效率低下 基准测试很简单:它执行查询,在光标上迭代,并检查每个文档中的相同字段。在python版本中,我每秒可以检查大约22k个文档。在java版本中,我每秒可以检查大约220k个文档 我看到了一些关于python性能的类似

我在mongodb用户列表上问了同样的问题:

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

我运行了一个简单的实验,比较了使用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:

    • Python比Java慢。由于Python不是类型化的,它的解释器无法完成所有Java JIT的“魔法”,因此在运行时它总是比较慢

    • 在Google Groups线程上,声明:

    • 结果中最大的惊喜是Python的基准测试是如何进行的 当我插入较短的值时,性能会下降。如果有任何问题,我 相比之下,Java的数字是 长字符串与短字符串基本相同”


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

      Java驱动程序可以将整个结果集读取到内存中,python驱动程序将结果流化。您可以尝试在两个驱动程序中设置批处理大小。您可以将完整的代码发布到Python和Java版本的代码中吗?我们可以查看其他人是否可以复制您的结果。只需注意,如果您按照指向Google Groups线程的链接进行操作,代码将被发布(两种语言),并由10gen人员审核,并执行进一步的测试。TL;DR 10gen测试显示python的速度比java慢了2倍多一点,测试中的一些差异可能来自使用的python版本。您可以发布以下详细信息:您的测试服务器(包括CPU、RAM等),并重新运行测试,显示比调用
      foo()
      前后更多的计时信息-我想,“Java在执行
      循环时执行一次
      迭代的平均时间是多少?对于python来说,在curs中为doc执行一次迭代的
      ?“如果您在python代码上运行探查器并发布结果,这将非常有帮助。它看起来像一个紧密的循环,而CPython通常非常不擅长。如果您需要这方面的参考,请咨询