【问题标题】:MongoDB python bindings an order of magnitude slower than java?MongoDB python绑定比java慢一个数量级?
【发布时间】:2012-04-14 15:10:32
【问题描述】:

我在 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 实现都可以忽略不计。游标迭代决定了运行时间。

【问题讨论】:

  • Java 驱动程序可以将整个结果集读入内存,python 驱动程序将结果流化。您可以尝试在两个驱动程序中设置 batch_size。
  • 您能否将完整的代码发布到 Python 和 Java 版本的代码中?我们可以看看其他人是否可以复制您的结果。
  • 请注意,如果您点击 Google Groups 线程的链接,代码将被发布(两种语言),并由 10gen 人员审核并执行进一步的测试。 TL;DR 10gen 测试表明,python 比 java 慢 2 倍多一点,测试中的一些差异可能来自使用的 python 版本
  • 您能否发布这些详细信息:您的测试服务器(包括 CPU、RAM 等),并重新运行测试,显示比调用 foo() 之前和之后更多的时间信息 - 我'我在想,“Java 执行一次 while 循环迭代的平均时间是多少?python 执行一次 for doc in curs 迭代需要多少时间?”
  • 如果您在 Python 代码上运行分析器并发布结果,这将是非常有用的。它看起来像一个紧密的循环,而 CPython 通常很不擅长。如果您需要参考,请咨询docs.python.org/library/profile.html

标签: mongodb pymongo mongodb-java


【解决方案1】:

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

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

  2. 在 Google Groups 线程中声明:

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

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

【讨论】:

    猜你喜欢
    • 2022-10-23
    • 1970-01-01
    • 2016-08-23
    • 2016-06-19
    • 2023-03-18
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多