2009-11-06 8 views
7

比較的CPUを大量に消費する(PILを使用してイメージをレンダリングする)カスタム管理コマンドをプロファイルしたいと思います。私は、次のコマンドを使用すると、私は私のプロファイリング結果にDjangoのモジュール(管理者、ORMなど)のすべての種類を取得:Djangoカスタム管理コマンドを排他的にプロファイルする方法

python -m cProfile manage.py testrender 

は、私は潜在的ジャンゴインポートすることができ、すべての輸入を削除したが、私は推測しています以下は、犯人です:

from django.core.management.base import BaseCommand, CommandError 

除外する方法はありますかcProfile結果はありますか? (ファイル名のみが表示され、パスはありません)または、プロファイルからそれぞれのモジュール/パッケージを除外/包含する他の方法はありますか?

+0

おそらく自分でgrepを実行しますか? – Geo

+0

@Geo grepはファイルパスが指定されていないためあまり役に立ちません。ファイル名のみが出力されます。今私がプロファイリングするutils.pyがあり、Djangoのどこかにutils.pyがあるとします。 – muhuk

答えて

13

私は次のようにこの問題を解決:統計は_handleの範囲内で収集されたプロファイリング

from cProfile import Profile 
from django.core.management.base import BaseCommand 


class Command(BaseCommand): 
    ... 

    def _handle(self, *args, **options): 
     # Actual code I want to profile 
     pass 

    def handle(self, *args, **options): 
     if options['profile']: 
      profiler = Profile() 
      profiler.runcall(self._handle, *args, **options) 
      profiler.print_stats() 
     else: 
      self._handle(*args, **options) 

をこのように。だから、代わりに:

python -m cProfile manage.py testrender 

私は実行する必要があります。さらに良いです

python manage.py testrender --profile 

+0

素晴らしい答え、分かち合いに感謝します。 – Hassek

+1

これはDjangoの変更でもはや有効ではないようですが、私はこれを理解しました。 [ここに更新例があります](https://gist.github.com/4236077)。 – Tom

0

回答が見つからない場合は、 Gprof2Dotexplained hereとして受け入れることができます。

私は興味のないモジュールを除外しませんが、コードとDjangoモジュールを視覚的に分離して検査するのが簡単になることを願っています。

0

PIL機能を独自のモジュールで独自の機能/クラスに分けて、管理コマンドからインポートします。次に、Djangoから独立してPIL機能をテスト/プロファイルすることができます。

+0

これはあなたが言ったように、別々のモジュールでコマンドからインポートされているのと同じです。問題は、独立してプロファイルする方法です。私はスーパー・アイソレーションを必要としないし、関連する50件のエントリーと950件の無関係なエントリーを望んでいない。私はいくつかのコードを投稿したいですか? – muhuk

+0

問題がどこにあるのかわかりません。独自のモジュール(Djangoへの参照が全くありません)に分かれている場合は、そのモジュールを実行する簡単なテストハーネスを記述することはできません。あなたのプロファイル出力にDjangoコードがどのようにあるのかは分かりません。 –

+0

別の実行可能ファイルを作成することは意味しますか?それが解決策になります。私はちょうどDjangoの管理コマンドを使用して、どういうことかどうかを調べようとしています。 – muhuk

関連する問題