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 は、関数が 1 回の呼び出しにかかった平均時間、つまり tottime/ncalls です。
  • cumtime は、サブ関数を含む、その関数内で費やされた合計時間です
  • percall は最初の percall に似ていますが、今度は cumtime です

これは、大量の時間が に費やされていることを示していsocket.pyます。具体的にreadlineは、数回呼び出され、毎回かなりの時間がかかります。 create_connectionは 1 回だけ呼び出されますが、 の呼び出しよりもさらに時間がかかりますreadline。内posixpath.pyislinkは、膨大な回数の呼び出しが行われますが、各呼び出しにかかる時間はごくわずかです。

それが一度しか呼び出されないことを考えるとcreate_connection(これは理にかなっています)、それを変更するためにできることはあまりありません。

readline関数がいつ呼び出されるかを把握し、コードを変更して複数回の呼び出しを避けることで、呼び出される回数を減らすことができる可能性がありますがreadline、それが十分かどうかを判断するのに十分なコードの知識がありません。できるだろう。

への呼び出しを減らすことができる可能性が非常に高いようですがislink、速度にはわずかな違いしかありません。

コードの速度を劇的に向上させる唯一の方法は、これらの呼び出しを減らすことです。そのreadlineため、いつ呼び出されるかを把握し、それらの呼び出しを最小限に抑えることに集中します。

于 2012-12-24T04:45:36.213 に答える
0

これは、ほぼ 3 秒かかる readline への呼び出しが 11 回あることを示しています。これを下げる場合は、実行中の I/O を停止する (または実行を減らす) 必要があります (ファイルを開いて行を解析すると想定しています)。

于 2012-12-24T04:44:26.073 に答える