Облищенные счетные RPC и расчетные затраты

Я делаю некоторые диагностические операции с моей встроенной встречной встречей для Google App Engine, и я не уверен, откуда идут дополнительные RPC.

Исходная версия с 20 шагами при получении не кэшированных счетчиков для 20 счетчиков дает следующую информацию в Appstats:

RPCs memcache.get 100 memcache.set 80 memcache.del 0 datastore.get 60 datastore_commit 0 datastore_put 0 datastore_begin_transaction 0 Billed Ops datastore_read 420 datastore_write 0 Cost 29,400 

Для справки, вот код счетчика:

 class GeneralCounterShard(ndb.Model): """Shards for each named counter.""" count = ndb.IntegerProperty(default=0) def get_count(name): """Retrieve the value for a given sharded counter. Args: name: The name of the counter. Returns: Integer; the cumulative count of all sharded counters for the given counter name. """ total = memcache.get(name) if total is None: total = 0 all_keys = GeneralCounterShardConfig.all_keys(name) for counter in ndb.get_multi(all_keys): if counter is not None: total += counter.count memcache.add(name, total, 60) return total 

Когда я изменяю счетный код счетчика, чтобы get_count «classmethod» класса GeneralCounterShard, RPC резко изменяются:

 RPCs memcache.get 100 memcache.set 80 memcache.del 20 datastore.get 80 datastore_commit 20 datastore_put 20 datastore_begin_transaction 20 Billed Ops datastore_read 440 datastore_write 60 Cost 36,800 

Для справки, вот изменение:

 class GeneralShardedCounter(ndb.Model): count = ndb.IntegerProperty(default=0) @classmethod def get_count(name): total = memcache.get(name) if total is None: total = 0 all_keys = GeneralShardedCounterConfig.all_keys(name) for counter in ndb.get_multi(all_keys): if counter is not None: total += counter.count memcache.add(name, total, 60) return total 

В обзоре разница между этими двумя:

 RPCs memcache.get +0 memcache.set +0 memcache.del +20 datastore.get +20 datastore_commit +20 datastore_put +20 datastore_begin_transaction +20 Billed Ops datastore_read +20 datastore_write +60 Cost +7,400 

Что может вызвать скачок в RPC, а также читать и записывать, просто используя один метод classmethod модели ndb?