2011-07-10 6 views
2

私は初心者です。私のコードをプロファイルし始めたばかりで、なぜcProfileによって与えられた経過時間がtime.time()を使って与えられた時間からずっと離れているのか混乱しました。Pythonプロファイルの落とし穴

# Python 2.7.2 

import cProfile 

def f(n): 
    G = (i for i in xrange(n)) 
    sum = 0 
    for i in G: 
     sum += i 

num = 10**6 

cProfile.run('f(num)') 

これは( 1000004関数はtime.timeでしかし2.648秒

に呼び出しています)、私は私が読んだものから、0.218000173569秒

import time 

x = time.time() 
f(num) 
print time.time() - x 

を取得し、私はこれがかもしれ推測cProfileのオーバーヘッドが原因です。 cProfileのタイミングが非常に遅くなる可能性がある場合や、より正確なタイミングを得るための一般的なヒントはありますか?

答えて

3

あるべきプロファイリングのポイントは、あなたのプログラムのどの部分が最も時間を費やし、従って、最も注意を必要としているものを見つけることです。 1つの関数で90%の時間を使用している場合は、その関数をより効率的にする方法を調べる必要があります。実行に10秒か1000かどうかは関係ありません。

おそらくプロファイラがあなたに与える最も重要な情報は、何か何かが呼び出された回数です。なぜこれが便利なのは、特にネストされたループがある場合や、他の関数を呼び出す多くの関数がある場合、不必要に頻繁に呼び出す場所を見つけるのに役立ちます。プロファイラは、この情報を追跡するのに役立ちます。

プロファイリングオーバーヘッドは避けられず、大きくなります。しかし、プロファイラーに自分のタイミングを挿入してステートメントを印刷するよりも、プロファイラーにはやるほうがはるかに簡単です。

+0

「時間の90%が1つの機能で使用されている場合...」 - 私の主な心配は正確な時間ではなく、相対時間です。私はそれが90%を占めるようなものが実際には1%を占めると想像することができます。私は複雑なことがあると理解していますが、「[何らかの理由で]プロファイラに何らかの操作が一般的に膨らんでしまうような有用なヒューリスティックがあるかどうかは疑問です。 – rallen

+0

@rallen:(絶対時間ではなく)費やされた時間のパーセンテージを得ることは、正確に私が作ろうとしていた点です。プロファイラを使用するときは、プロファイルされるさまざまなコンポーネントのリストされた時間の間の関係と同じくらい絶対時間に頼るべきではありません。通常、ここでの例よりもはるかに複雑な関数を調べるために、プロファイラを使用することに注意してください。 –

+0

@rallen:本物のボトルネックが隠されたり、高速セクションがボトルネックのように見えるように、複雑なものはプロファイラの数字を乱しています。あなたが書く可能性のあるものにはこれが遭遇するとは思いません。それは決して起こらないとは言えませんが、それは私が心配する理由があったわけではありません。あなたが信じられないほど信じられないほど魚のような方法でプロファイリングしたようなものに遭遇した場合は、* Stack Overflowまたはcomp.lang.pythonの質問としてそれを持ち出してください。 ;) –

1

cProfileはCPU timeですが、time.time()を使用すると経過時間が表示されることに注意してください。

多分unic timeプログラムを試すことができます。

➜ sandbox /usr/bin/time -p python profiler.py 

real   0.17 
user   0.14 
sys   0.01 

CPU時間は、ユーザ+ SYS

関連する問題