Я задал этот же вопрос в списке пользователей mongodb: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24
Я надеялся, что у кого-то на этом форуме может быть какое-то понимание ...
Я запустил простойЭксперимент, сравнивающий производительность итерации курсора с использованием Python и Java, обнаружил, что реализация Python примерно в 10 раз медленнее.Я надеялся, что кто-нибудь скажет мне, ожидается ли это различие или я делаю что-то явно неэффективное на стороне Python.
Тест прост: он выполняет запрос, выполняет итерацию по курсору и проверяет одно и то же поле в каждом документе.В версии Python я могу проверять около 22 тыс. Документов в секунду.В Java-версии я могу проверять около 220 тыс. Документов в секунду.
Я видел несколько похожих вопросов о производительности Python, воспользовался советом и убедился, что использую расширения C:
>>> import pymongo
>>> pymongo.has_c()
True
>>> import bson
>>> bson.has_c()
True
Наконец, я неполагаю, что расхождение связано с фундаментальными различиями между python и java, по крайней мере, на уровне моего тестового кода.Например, если я храню запрашиваемые документы в списке Python, я могу очень быстро перебрать этот список.Другими словами, это не неэффективный цикл for Python, который объясняет разницу.Кроме того, при вставке документов я получаю практически одинаковую производительность Java и Python.
Вот еще несколько подробностей о запросе:
- И в реализациях Python, и в Java используется один и тот же запросна той же коллекции и запустить на той же машине.
- Коллекция содержит около 20 миллионов документов.
- Запрос возвращает около 2 миллионов документов, т.е. я получаю около 10% коллекции.
- Каждый документ содержит три простых поля: дату и две строки.
- Запрос индексируется, и время, затрачиваемое на фактический запрос, незначительно как для реализаций Python, так и для Java. Это итерация курсора, которая учитывает время выполнения.