Подтвердить что ты не робот

Настроения 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. Итерация курсора, учитывающая время выполнения.
4b9b3361

Ответ 1

Хорошо смотря на ваш пост в Google Groups, а вот мой 2c:

  • Python медленнее, чем Java. Поскольку Python не набирается, интерпретатор не может выполнять все Java JIT "magic", и поэтому он всегда будет медленнее во время выполнения.

  • В потоке групп Google указано, что:

"Большой сюрприз в результатах заключается в том, как тест Python ухудшение производительности при введении более коротких значений. Во всяком случае, я ожидал бы противоположного. Сравнительно, номера Java по существу то же самое для длинных и коротких строк ".

Это может ввести в заблуждение из-за асинхронного поведения Mongo, когда дело доходит до записи. Убедитесь, что вы устанавливаете тот же "Контент записи", когда вы запускаете эти записи как в тестах Java, так и в Python (и предпочтительно устанавливаете их на SAFE_MODE). Другими словами, если вы специально не устанавливаете Контент записи, убедитесь, что значение по умолчанию для драйвера одинаково для обоих вариантов Python и Java.