Я задал этот же вопрос в списке пользователей mongodb: http://groups.google.com/group/mongodb-user/browse_thread/thread/b3470d6a867cd24
Я надеялся, что кто-то на этом форуме может иметь некоторое представление...
Я провел простой эксперимент, сравнивающий производительность итерации курсора с помощью python vs. 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, я могу быстро перебрать этот список. Другими словами, это не неэффективный python for-loop, который учитывает разницу. Кроме того, при вставке документов я получаю почти идентичную производительность Java vs. Python.
Вот несколько дополнительных сведений о запросе:
- Оба варианта python и java используют один и тот же запрос в одной коллекции и запускаются на одном компьютере.
- Коллекция содержит около 20 миллионов документов.
- Запрос возвращает около 2 миллионов документов, т.е. я извлекаю около 10% коллекции.
- Каждый документ содержит три простых поля: дата и две строки.
- Запрос индексируется, и время, затрачиваемое на фактический запрос, ничтожно мало для реализации python и java. Итерация курсора, учитывающая время выполнения.