Является ли запрос хранилища данных Python appengine намного (> 3x) медленнее, чем Java? - PullRequest
4 голосов
/ 08 октября 2010

Я исследовал устройство, чтобы выяснить, могу ли я использовать его для проект и, пытаясь выбрать между Python и Java, я столкнулся с неожиданная разница в производительности запросов хранилища данных: от среднего до большие запросы к хранилищам данных в Python более чем в 3 раза медленнее, чем в Java.

Мой вопрос: это разница в производительности для запросов хранилища данных (Python в 3 раза медленнее, чем Java) нормально, или я делаю что-то не так в мой код Python, который мешает с числами?

Моя сущность выглядит так:

лицо

имя (длина 8) фамилия (длина 8) адрес (20) город (10) состояние (2) почтовый индекс (5)

Я заполняю хранилище данных 2000 записями Person с каждым полем точно длина, указанная здесь, все заполнены случайными данными и без поля проиндексированы (просто чтобы вставки шли быстрее).

Затем я запрашиваю записи 1k Person из Python (без фильтров, без упорядочивания):

q = datastore.Query("Person")
objects = list(q.Get(1000))

И записи 1k Person из Java (аналогично, без фильтров, без упорядочения):

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
Query q = new Query("Person");
PreparedQuery pq = ds.prepare(q);
// Force the query to run and return objects so we can be sure
// we've timed a full query.
List<Entity> entityList = new ArrayList<Entity>(pq.asList(withLimit(1000)));

С этим кодом код Java возвращает результаты в ~ 200 мс; Питон код занимает гораздо больше времени, в среднем> 700 мс. Оба приложения находятся на одном идентификатор приложения (с разными версиями), поэтому они используют одно и то же хранилище данных и должны быть на ровном игровом поле.

Весь мой код доступен здесь, на случай, если я пропустил какие-либо детали:

http://github.com/greensnark/appenginedatastoretest

1 Ответ

5 голосов
/ 08 октября 2010

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

Вы можете проверить это, сравнив время, необходимое для запроса отдельной записи. Помните, что вам нужно будет протестировать несколько раз и усреднить итоговое значение, чтобы получить истинный эталон для учета возможных колебаний задержки на бэкэнде.

В общем, можно ожидать, что скомпилированный статически типизированный язык , такой как Java или Scala, всегда будет быстрее, чем интерпретируемый язык динамически типизированный язык как в Ruby или Python.

...