Я задал этот же вопрос в списке пользователей 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. Итерация курсора учитывает время выполнения.
foo()- я думаю, сколько в среднем времени это занимает для Java выполнить одну итерацию циклаwhile? для python выполнить одну итерациюfor doc in curs? - person cegfault   schedule 19.07.2012