Настроения python MongoDB на порядок медленнее, чем java?
Я задал этот же вопрос в списке пользователей 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. Итерация курсора, учитывающая время выполнения.
Ответы
Ответ 1
Хорошо смотря на ваш пост в Google Groups, а вот мой 2c:
-
Python медленнее, чем Java. Поскольку Python не набирается, интерпретатор не может выполнять все Java JIT "magic", и поэтому он всегда будет медленнее во время выполнения.
-
В потоке групп Google указано, что:
"Большой сюрприз в результатах заключается в том, как тест Python
ухудшение производительности при введении более коротких значений. Во всяком случае, я
ожидал бы противоположного. Сравнительно, номера Java
по существу то же самое для длинных и коротких строк ".
Это может ввести в заблуждение из-за асинхронного поведения Mongo, когда дело доходит до записи. Убедитесь, что вы устанавливаете тот же "Контент записи", когда вы запускаете эти записи как в тестах Java, так и в Python (и предпочтительно устанавливаете их на SAFE_MODE). Другими словами, если вы специально не устанавливаете Контент записи, убедитесь, что значение по умолчанию для драйвера одинаково для обоих вариантов Python и Java.