在所有这些非 rpc 时间内为获取做了什么?

What is being done in all this non-rpc time for a fetch?

假设我有一些模型对象,并且我的数据存储区中有大约 2000 个实体。通过以下代码使用应用统计信息

ndb.get_context().set_cache_policy(lambda x: False)
ndb.get_context().set_memcache_policy(lambda x: False)
objects = Object.query().fetch()

我得到以下配置文件

在不等待 RPC 的 ~18 秒内正在做什么?

可能会将这些实体反序列化为 python 个对象,并且过程非常非常慢。无论如何,您不应该在来自客户端的单个 Web 请求期间获取那么多实体,并且如果它用于某种批处理作业 - 时间不应该那么重要(另请注意,一旦你处理了几千个项目 - 你的请求可能会在某个时候超时,因此您需要使用 query cursors).

之类的东西

您可能还会发现 this and this 博客文章有助于加快反序列化过程。

此外,无关紧要,但这是 Golang 在完全相同的任务上表现出色并且表现优于 Python 的众多案例之一(延迟几乎不存在)。