如何理解 Django 视图函数的配置文件输出

Posted

技术标签:

【中文标题】如何理解 Django 视图函数的配置文件输出【英文标题】:How to understand the profile output of a Django view function 【发布时间】:2012-12-24 04:30:50 【问题描述】:

我正在尝试加快 django 项目中的视图。使用来自https://code.djangoproject.com/wiki/ProfilingDjango 的脚本,我生成了以下输出,其中前 3 名占我总时间的 57%。

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       11    2.898    0.263    2.898    0.263 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py:406(readline)
        1    0.340    0.340    0.343    0.343 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py:537(create_connection)
    37587    0.305    0.000    0.346    0.000 /Users/nai/.virtualenvs/tripconomics/lib/python2.7/posixpath.py:130(islink)

我之前没有做过太多的python/应用程序代码优化。我应该如何解释这一点并尝试降低总时间?

【问题讨论】:

【参考方案1】:

您的数据描述了给定函数被调用的次数以及在该函数中花费了多少时间。

ncalls 是函数被调用的次数 tottime 是在该函数中花费的总时间,不包括子函数 percall 是函数每次调用所用的平均时间量,即 tottime/ncalls cumtime 是在该函数中花费的总时间,包括子函数 percall 与第一次 percall 类似,但现在是 cumtime

所以这告诉您大量时间都花在socket.py 上。具体来说,readline 被调用了几次,每次都需要相当长的时间。 create_connection 只被调用一次,但这比调用readline 需要更多时间。而在posixpath.py内,islink被调用的次数很多,但每次调用的时间都很短

鉴于create_connection 只被调用一次(这是有道理的),您可能无能为力来改变它。

您可以通过确定何时调用函数并更改代码以避免多次调用readline 来减少调用readline 的次数,但我没有对您的代码有足够的了解,可以说明这是否可行。

您似乎很有可能减少对islink 的调用,但这只会对速度产生很小的影响。

真正要显着提高代码速度的唯一方法是减少那些 readline 调用,因此我会专注于找出调用它的时间并尽量减少这些调用。

【讨论】:

非常感谢您的回复。我怎样才能找到你所说的功能:It's possible that you could reduce the number of times that readline is called by figuring out when the function is called and changing your code to avoid multiple calls to readline【参考方案2】:

这表明您有 11 次调用 readline 需要将近 3 秒。如果要降低此值,则需要停止(或减少)正在执行的任何 I/O(我假设,打开文件并解析行)。

【讨论】:

以上是关于如何理解 Django 视图函数的配置文件输出的主要内容,如果未能解决你的问题,请参考以下文章

Django视图函数的使用

django中url路由配置及渲染方式

第二章--django--URL和视图函数

Django

Django路由配置系统视图函数

Django框架之路由和视图的配置以及Path转换器的使用