Python 2 到 3 升级后 Django 初始页面加载缓慢

Django Initial Page Load Slow After Python 2 to 3 Upgrade

我 运行 Django 1.11.20。我刚刚(终于)从 Python 2.7 跳到了 3.7。

我注意到自升级到 Python 3 后,清除缓存后的第一个页面加载速度非常慢。到目前为止,我的开发机器上只有我的 Python 3 环境,所以我在使用 ./manage.py runserverFileBasedCache 后端时遇到了这个问题。我不知道我是否会在生产堆栈(nginx、uwsgi、redis 等)上遇到同样的事情。

我正在使用 Django 调试工具栏,它给了我一些提示 不是什么问题 ,但我不确定我应该去哪里看看是什么问题是。

调试工具栏给出的时间 运行 在我的开发机器上的 Python 2.7 环境中加载一个带有空缓存的简单页面是:

调试工具栏给出的时间 运行 在我的开发机器上的 Python 3.7 环境中加载具有空缓存的同一页面是:

(我在这台开发机器上使用基于文件的缓存,所以当我说 "with an empty cache" 我的意思是我 rm -r cache 在我的浏览器中加载 URL 之前。 )

因此 SQL 和缓存时间在升级后略有加快,但 CPU 时间翻了一番。当我在调试工具栏中打开 "Time" 面板时,我看到增加的 "timing attribute" 是 "request".

每个页面都会发生同样的事情(包括由 TemplateView 生成的 HTML 页面,因此它们没有做任何棘手的事情),但仅当它首次从空缓存。在第一次响应之后,所有页面都恢复到与 Python 2 环境中大致相同的响应时间。所以跟最初的请求有关。

我不确定到哪里去尝试弄清楚 Django 只在第一个请求时在做什么。任何指针?或者有什么明显的东西可以预期在从 Python 2.7 到 3.7 的跳跃中变慢?

我终于能够将这个问题追溯到 Django 调试工具栏本身,它在我的 Python 3 升级期间从 1.11 升级到 2.0。具体来说,是工具栏的 SQL 面板导致了速度下降。我有一个上下文处理器,如果缓存的对象不存在,它会执行查询。查询本身很快,但出于某种原因,Django Debug Toolbar 2.0 为其生成堆栈跟踪的速度非常慢。我还没有弄清楚 1.11 和 2.0 之间发生了什么变化导致这种可怕的性能损失,但现在我知道问题出在哪里,我可以解决它。