我在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实现,对查询建立索引并且在实际查询中花费的时间可以忽略不计,这是游标迭代导致的运行时间。
  • 最佳答案

    同样,也请查看您在Google网上论坛上的帖子,这是我的2c:

  • Python比Java慢。由于未键入Python,因此它的解释器无法完成所有Java JIT的“魔术”,因此在运行时始终会变慢。
  • 在Google网上论坛线程中指出:

  • “结果令人惊讶的是Python基准测试如何
    当插入较短的值时,性能会下降。如果有的话,我
    本来是相反的。比较而言,Java编号是
    长字符串和短字符串基本相同”。

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

    10-07 19:45
    查看更多