2012-04-07 3 views
1

ファイルに大きなバイナリファイル(> 50MB)を受け取り、ファイルに関連する計算(解読、解凍...)を実行するPythonで書かれたHTTPサーバーがあります。私はこれらの操作を実行するのにかかる時間の見積もりを得たいと思います。私のpythonサーバーは、Ubuntu 11.10のマルチCPUとマルチコアサーバー上で動作しています。Pythonコードでサーバー側の実行時間をプロファイルするオプション

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

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

感謝。

答えて

0

I)は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を使用して、自分のコードが最も多くの時間を費やしている場所を感じています。私はそれがあなたに必要なデータを与えると思います。

+0

私はこれを試してみましょう。ありがとう。 cProfileのオーバーヘッドは何ですか? –

+0

[cProfileは長時間実行されるプログラムのプロファイリングに適したオーバーヘッドのあるAC拡張です。](http://docs.python.org/library/profile.html#module-profile)私はかなり頻繁に使用しています。オーバーヘッドなどの理由で、「途中で乗っている」ような気がしたことはありません。それが提供するデータは、私がそれが無関係に価値があると思うだけのものです。 –

関連する問題