Google-app-engine NDB iter keys_only - PullRequest
4 голосов
/ 01 апреля 2012

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

Правильно ли использовать:

for key in qry.iter(keys_only=True):
    item = key.get()
    #do something with item

Будет лучше, чем:

for item in qry:
    #do something with item

Поскольку в первом примере запрос будет загружать только ключи, а последующие вызовы к key.get() будут использовать механизм кэширования NDB, тогда как в примере 2 всегда будут извлекать объекты из хранилища? Или я что-то не так понял?

Ответы [ 2 ]

7 голосов
/ 02 апреля 2012

Я бы сомневался, что вторая форма будет работать лучше - всегда возможно, что значения не в кэше, а затем, если вы получите более одной сущности обратно, вы бы делать несколько круговых поездок. Это быстро становится медленнее.

Действительно, лучший подход - это то, что показано в http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118 - используйте ndb.multi_get (q.fetch (keys_only = True)). Но даже это хуже, если ваш рейтинг попаданий в кеш слишком низок; это широко обсуждается в этом выпуске.

1 голос
/ 01 апреля 2012

AFAIK Это не будет отличаться, потому что внутри ndb кэширует все, включая запросы. Если вы собираетесь делать другие вещи с каждым, попробуйте async api. это может сэкономить драгоценное время. edit: более того, если ndb знает запрос заранее, он может даже предварительно выбрать их.

Я прочитал это шесть месяцев назад, поэтому не уверен, каково текущее поведение.

...