26

我在 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 的性能几乎相同。

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

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

1 回答 1

2

看看你在 Google Groups 上的帖子,这是我的 2c:

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

  2. 在 Google Groups 线程中,声明如下:

“结果中最大的惊喜是,当我插入较短的值时,Python 基准测试性能如何下降。如果有的话,我会预料到相反的情况。相比之下,长字符串和短字符串的 Java 数字基本相同”。

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

于 2012-08-19T22:53:08.293 回答