【发布时间】: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