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

时间:2012-12-24 04:30:50

标签: python django profiling

我正在尝试加速我的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 /应用程序代码优化。我该如何理解这一点,并试图让整个时间下降?

2 个答案:

答案 0 :(得分:2)

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

  • ncalls是调用该函数的次数
  • tottime是该功能所花费的总时间,不包括子功能
  • percall是函数每次调用所花费的平均时间,或者是tottime / ncalls
  • cumtime是该功能所花费的总时间,包括子功能
  • percall类似于第一个percall,但现在用于cumtime

因此,这告诉您socket.py花费了大量时间。具体来说,readline被称为几次,每次都需要相当长的时间。 create_connection仅被调用一次,但这比调用readline所需的时间更长。在posixpath.py内,islink被称为大量时间,但每次都需要很短的时间

鉴于create_connection只被调用一次(这是有道理的),你可能没有太多可以改变它。

你可以通过弄清楚调用函数的时间来减少调用readline的次数,并且当一个人满足时,可以更改代码以避免多次调用readline,但是我可以没有足够的代码知识来说明这是否可行。

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

真正唯一可以显着提高代码速度的方法是减少readline次调用,这样我就可以专注于确定何时调用它并最小化这些调用。

答案 1 :(得分:0)

这表明您有11次调用readline需要花费将近3秒的时间。如果你要降低它,你需要停止做(或做更少)你做的任何I / O(我假设,打开文件并解析行)。