Привязки Python MongoDB на порядок медленнее, чем Java? - PullRequest
26 голосов
/ 31 марта 2012

Я задал этот же вопрос в списке пользователей 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. Это итерация курсора, которая учитывает время выполнения.

1 Ответ

2 голосов
/ 20 августа 2012

Хорошо, глядя на ваш пост в группах Google, вот мой 2c:

  1. Python медленнее, чем Java. Поскольку Python не является типизированным, его интерпретатор не может выполнить всю «магию» Java JIT, и поэтому он всегда будет медленнее во время выполнения.

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

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

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

...