1

我正在尝试加快我的 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/应用程序代码优化。我应该如何解释这一点并尝试降低总时间?

4

2 回答 2

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调用,因此我将专注于弄清楚它何时被调用并最小化这些调用。

于 2012-12-24T04:45:36.213 回答
0

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

于 2012-12-24T04:44:26.073 回答