1

大きなバイナリ ファイル (>50MB) を受け入れ、ファイルに対してファイル関連の計算 (復号化、圧縮解除など) を実行する Python で記述された HTTP サーバーがあります。これらの操作の実行にかかる時間を正確に見積もりたいと考えています。私のpythonサーバーは、Ubuntu 11.10のマルチCPUおよびマルチコアサーバーで実行されています。

現在date.now()、さまざまな操作の実行時間を取得するために ( の時間差を行っています。プロファイリング機能を提供する Python モジュールがいくつかあることは知っています。しかし、私の理解では、それらは小さなコード スニペットのみに限定されています。

私の他のオプションは何ですか?

ありがとう。

4

1 に答える 1

0

cProfile はかなり堅実で、date.now() のようなものを使用することで間違いなく改善されたと思います。これは、役に立たないフィボナッチジェネレーターと少し役に立たないフィボナッチジェネレーターを比較するために cProfile が生成するものです。

$ python -m cProfile script.py
         4113777 function calls (1371305 primitive calls) in 1.337 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 cProfile.py:5(<module>)
        1    0.000    0.000    0.000    0.000 cProfile.py:66(Profile)
        1    0.009    0.009    1.337    1.337 script.py:1(<module>)
2692508/30    1.069    0.000    1.268    0.042 script.py:3(fib)
74994/25000    0.058    0.000    0.058    0.000 script.py:9(fibber)
  1346269    0.200    0.000    0.200    0.000 {max}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        2    0.001    0.000    0.001    0.000 {range}

使用したコードは次のとおりです。

import cProfile

def fib(num):
    if num < 3:
        return max(num, 1)
    return fib(num - 1) + fib(num - 2)

fibdict = {0:1, 1:1, 2:2}
def fibber(num):
    if num not in fibdict:
        n = fibber(num - 1) + fibber(num - 2)
        fibdict[num] = n
    return fibdict[num]

a = [fib(i) for i in range(30)]
b = [fibber(i) for i in range(25000)]

cProfile は、fib の実行速度がどの程度遅いかを明確に示しており、呼び出しごとの時間/呼び出し数、およびメソッドで費やされた合計時間に関する優れたデータを提供します。明らかにこれは些細な/おもちゃのコードですが、私は定期的に cProfile を使用して、自分のコードが最も多くの時間を費やしている場所を把握しており、重要なコードには非常に効果的であることがわかりました。必要なデータが得られると思います。

于 2012-04-07T13:20:53.637 に答える