Pythonスクリプトをどのようにプロファイリングできますか?

1350
Chris Lawlor 2009-02-25 06:01.

プロジェクトオイラーやその他のコーディングコンテストは、多くの場合、実行に最大時間がかかるか、特定のソリューションの実行速度が自慢です。Pythonでは、アプローチがやや厄介な場合があり__main__ます。つまり、にタイミングコードを追加します。

Pythonプログラムの実行にかかる時間をプロファイリングする良い方法は何ですか?

29 answers

1438
Chris Lawlor 2009-02-25 06:01.

Pythonには、cProfileと呼ばれるプロファイラーが含まれています。合計実行時間だけでなく、各関数の時間を個別に示し、各関数が呼び出された回数を示し、最適化を行う場所を簡単に決定できるようにします。

次のように、コード内から、またはインタープリターから呼び出すことができます。

import cProfile
cProfile.run('foo()')

さらに便利なことに、スクリプトの実行時にcProfileを呼び出すことができます。

python -m cProfile myscript.py

さらに簡単にするために、「profile.bat」という小さなバッチファイルを作成しました。

python -m cProfile %1

だから私がしなければならないのは実行することだけです:

profile euler048.py

そして私はこれを得る:

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

編集:PythonプロファイリングというタイトルのPyCon2013
からYouTube経由の優れたビデオリソースへのリンクを更新しました。

440
gak 2012-08-06 19:37.

少し前にpycallgraph、Pythonコードから視覚化を生成するものを作成しました。編集:この記事の執筆時点での最新リリースである3.3で動作するように例を更新しました。

GraphVizをpip install pycallgraphインストールした後、コマンドラインから実行できます。

pycallgraph graphviz -- ./mypythonscript.py

または、コードの特定の部分をプロファイリングできます。

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

これらのいずれかによりpycallgraph.png、以下の画像のようなファイルが生成されます。

208
Joe Shaw 2009-12-18 06:30.

プロファイラーの使用は(デフォルトでは)メインスレッドでのみ機能し、他のスレッドを使用しても情報を取得できないことを指摘しておく価値があります。プロファイラーのドキュメントには完全に記載されていないため、これはちょっとした落とし穴になる可能性があります。

スレッドのプロファイルも作成するthreading.setprofile()場合は、ドキュメントの関数を確認することをお勧めします。

threading.Threadそれを行うために独自のサブクラスを作成することもできます。

class ProfiledThread(threading.Thread):
    # Overrides threading.Thread.run()
    def run(self):
        profiler = cProfile.Profile()
        try:
            return profiler.runcall(threading.Thread.run, self)
        finally:
            profiler.dump_stats('myprofile-%d.profile' % (self.ident,))

ProfiledThread標準のクラスの代わりにそのクラスを使用します。柔軟性が増すかもしれませんが、特にクラスを使用しないサードパーティのコードを使用している場合は、それだけの価値があるかどうかはわかりません。

158
brent.payne 2011-10-08 14:04.

Python wikiは、リソースをプロファイリングするための優れたページです。 http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code

Pythonのドキュメントと同じように: http://docs.python.org/library/profile.html

Chris Lawlorが示すように、cProfileは優れたツールであり、画面への印刷に簡単に使用できます。

python -m cProfile -s time mine.py <args>

またはファイルする:

python -m cProfile -o output.file mine.py <args>

PS> Ubuntuを使用している場合は、必ずpython-profileをインストールしてください

apt-get install python-profiler 

ファイルに出力する場合は、次のツールを使用して優れた視覚化を得ることができます

PyCallGraph:コールグラフ画像を作成するためのツール
インストール:

 pip install pycallgraph

実行:

 pycallgraph mine.py args

見る:

 gimp pycallgraph.png

あなたはpngファイルを見るために好きなものを使うことができます、私はgimpを使いました
残念ながら私はしばしば得ます

ドット:グラフがcairo-rendererビットマップには大きすぎます。フィットするように0.257079でスケーリング

それは私の画像を使い物にしないほど小さくします。だから私は一般的にsvgファイルを作成します:

pycallgraph -f svg -o pycallgraph.svg mine.py <args>

PS>必ずgraphviz(ドットプログラムを提供する)をインストールしてください:

pip install graphviz

@maxy / @quodlibetorを介したgprof2dotを使用した代替グラフ:

pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg
139
quodlibetor 2012-12-12 13:16.

この回答に対する@Maxyのコメントは、それ自体の回答に値すると思うほど私を助けてくれました:私はすでにcProfileで生成された.pstatsファイルを持っていて、pycallgraphで物事を再実行したくなかったので、gprof2dotを使用してきれいになりましたsvgs:

$ sudo apt-get install graphviz $ git clone https://github.com/jrfonseca/gprof2dot
$ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin
$ cd $PROJECT_DIR
$ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg

とBLAM!

ドット(pycallgraphが使用するものと同じもの)を使用するため、出力は同じように見えます。しかし、gprof2dotが失う情報は少ないという印象を受けます。

89
zaxliu 2016-05-25 22:06.

このトピックを調査しているときに、SnakeVizという便利なツールに出くわしました。SnakeVizは、Webベースのプロファイリング視覚化ツールです。インストールと使用は非常に簡単です。私がそれを使用する通常の方法は%prun、SnakeVizで統計ファイルを生成してから分析を行うことです。

使用される主なviz手法は、以下に示すサンバーストチャートです。このチャートでは、関数呼び出しの階層が円弧のレイヤーとして配置され、時間情報が角度幅でエンコードされます。

最良のことは、チャートを操作できることです。たとえば、ズームインするには円弧をクリックすると、円弧とその子孫が新しいサンバーストとして拡大され、詳細が表示されます。

85
CodeCabbie 2018-03-09 03:03.

最も簡単かつ最速のすべての時間が起こっている場所を見つける方法。

1. pip install snakeviz

2. python -m cProfile -o temp.dat <PROGRAM>.py

3. snakeviz temp.dat

ブラウザで円グラフを描画します。最大の部分は問題関数です。とてもシンプルです。

60
Federico 2016-05-11 22:32.

cProfileプロファイリングにkcachegrind最適ですが、結果の視覚化にも最適です。pyprof2calltreeハンドルの間でのファイル変換。

python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree

必要なツールをインストールするには(少なくともUbuntuに):

apt-get install kcachegrind
pip install pyprof2calltree

結果:

44
Nico Schlömer 2018-08-04 21:27.

最近、Pythonランタイムとインポートプロファイルを視覚化するためのマグロを作成しました。これはここで役立つかもしれません。

でインストール

pip install tuna

ランタイムプロファイルを作成する

python3 -m cProfile -o program.prof yourfile.py

またはインポートプロファイル(Python 3.7以降が必要)

python3 -X importprofile yourfile.py 2> import.log

次に、ファイルに対してマグロを実行します

tuna program.prof
41
Pete 2015-02-23 06:18.

また、GUIcProfileダンプビューアRunSnakeRunも言及する価値があります。それはあなたがソートして選択することを可能にし、それによってプログラムの関連部分にズームインします。写真の長方形のサイズは、かかった時間に比例します。長方形の上にマウスを置くと、テーブル内およびマップ上のすべての場所でその呼び出しが強調表示されます。長方形をダブルクリックすると、その部分が拡大されます。誰がその部分を呼び出し、その部分が何を呼び出すかが表示されます。

説明情報は非常に役立ちます。組み込みのライブラリ呼び出しを処理するときに役立つ、そのビットのコードが表示されます。コードを見つけるためのファイルと行を示します。

また、OPが「プロファイリング」と言ったことを指摘したいが、彼は「タイミング」を意味しているようだ。プロファイルを作成すると、プログラムの実行速度が低下することに注意してください。

35
BenC 2015-03-03 01:36.

pprofile

line_profiler(すでにここに提示されています)また、インスピレーションを得てpprofile、次のように説明されています:

線粒度、スレッド対応の決定論的および統計的純粋なPythonプロファイラー

これは、ライン粒度を提供するline_profiler、スタンドアロンコマンドまたはモジュールとして使用することができ、純粋のPythonであり、さらに容易で分析することができるcallgrind形式のファイルを生成することができます[k|q]cachegrind

vprof

次のように記述されたPythonパッケージであるvprofもあります。

[...]実行時間やメモリ使用量などのさまざまなPythonプログラム特性の豊富でインタラクティブな視覚化を提供します。

33
Ian Langmore 2011-10-21 06:05.

優れたプロファイリングモジュールはline_profilerです(スクリプトkernprof.pyを使用して呼び出されます)。こちらからダウンロードできます。

私の理解では、cProfileは各関数で費やされた合計時間に関する情報のみを提供します。したがって、コードの個々の行のタイミングは調整されません。多くの場合、1つの行に多くの時間がかかる可能性があるため、これは科学計算の問題です。また、私が覚えているように、cProfileは私がnumpy.dotと言って過ごしていた時間を捕らえませんでした。

16
David Mašek 2015-08-22 01:59.

すばらしい答えはたくさんありますが、結果のプロファイリングや並べ替えにコマンドラインまたは外部プログラムを使用します。

コマンドラインに触れたり、何もインストールしたりせずに、IDEで使用できる方法(eclipse-PyDev)を本当に見逃しました。だからここにあります。

コマンドラインなしのプロファイリング

def count():
    from math import sqrt
    for x in range(10**5):
        sqrt(x)

if __name__ == '__main__':
    import cProfile, pstats
    cProfile.run("count()", "{}.profile".format(__file__))
    s = pstats.Stats("{}.profile".format(__file__))
    s.strip_dirs()
    s.sort_stats("time").print_stats(10)

詳細については、ドキュメントまたはその他の回答を参照してください。

12
PypeBros 2011-11-10 02:59.

ない期待通りの仕事にマルチスレッドコードについてジョー・ショーの答えに続いて、私はそれを考え出しruncallcProfileのメソッドは単にやっているself.enable()と、self.disable()あなたは、単に自分でやるとあなたが-の間、好きなコードを持つことができるように、プロファイル関数呼び出しの周りの呼び出し既存のコードへの干渉を最小限に抑えます。

10
Walter 2009-02-25 10:31.

Virtaalのソースには、プロファイリング(特定のメソッド/関数の場合でも)を非常に簡単にすることができる非常に便利なクラスとデコレータがあります。その後、出力はKCacheGrindで非常に快適に表示できます。

9
Datageek 2015-03-31 01:11.

cProfileは迅速なプロファイリングに最適ですが、ほとんどの場合、エラーで終了していました。関数runctxは、環境と変数を正しく初期化することでこの問題を解決します。誰かに役立つことを願っています。

import cProfile
cProfile.runctx('foo()', None, locals())
9
Francois 2019-08-08 09:37.

これらすべての豪華なUIのインストールまたは実行に失敗した場合の、ターミナルのみの(そして最も単純な)ソリューション:完全に
無視cProfileしてpyinstrument、実行直後に呼び出しのツリーを収集して表示するに置き換えます。

インストール:

$ pip install pyinstrument

プロファイルと表示結果:

$ python -m pyinstrument ./prog.py

python2および3で動作します。

[編集]コードの一部のみをプ​​ロファイリングするためのAPIのドキュメントは、ここにあります。

8
moshevi 2019-09-12 09:52.

累積プロファイラーを作成する場合、つまり、関数を連続して数回実行し、結果の合計を監視することを意味します。

このcumulative_profilerデコレータを使用できます:

Python> = 3.6固有ですがnonlocal、古いバージョンで動作するため、削除できます。

import cProfile, pstats

class _ProfileFunc:
    def __init__(self, func, sort_stats_by):
        self.func =  func
        self.profile_runs = []
        self.sort_stats_by = sort_stats_by

    def __call__(self, *args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()  # this is the profiling section
        retval = self.func(*args, **kwargs)
        pr.disable()

        self.profile_runs.append(pr)
        ps = pstats.Stats(*self.profile_runs).sort_stats(self.sort_stats_by)
        return retval, ps

def cumulative_profiler(amount_of_times, sort_stats_by='time'):
    def real_decorator(function):
        def wrapper(*args, **kwargs):
            nonlocal function, amount_of_times, sort_stats_by  # for python 2.x remove this row

            profiled_func = _ProfileFunc(function, sort_stats_by)
            for i in range(amount_of_times):
                retval, ps = profiled_func(*args, **kwargs)
            ps.print_stats()
            return retval  # returns the results of the function
        return wrapper

    if callable(amount_of_times):  # incase you don't want to specify the amount of times
        func = amount_of_times  # amount_of_times is the function in here
        amount_of_times = 5  # the default amount
        return real_decorator(func)
    return real_decorator

関数のプロファイリング baz

import time

@cumulative_profiler
def baz():
    time.sleep(1)
    time.sleep(2)
    return 1

baz()

baz 5回実行し、これを印刷しました:

         20 function calls in 15.003 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       10   15.003    1.500   15.003    1.500 {built-in method time.sleep}
        5    0.000    0.000   15.003    3.001 <ipython-input-9-c89afe010372>:3(baz)
        5    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

回数を指定する

@cumulative_profiler(3)
def baz():
    ...
6
Mr. Girgitt 2014-02-20 05:38.

私のやり方はヤッピを使うことです(https://github.com/sumerc/yappi)。これは、RPCサーバーと組み合わせると特に便利です。ここでは、(デバッグのためだけでも)プロファイリング情報を開始、停止、および出力するメソッドを登録します。たとえば、次のようにします。

@staticmethod
def startProfiler():
    yappi.start()

@staticmethod
def stopProfiler():
    yappi.stop()

@staticmethod
def printProfiler():
    stats = yappi.get_stats(yappi.SORTTYPE_TTOT, yappi.SORTORDER_DESC, 20)
    statPrint = '\n'
    namesArr = [len(str(stat[0])) for stat in stats.func_stats]
    log.debug("namesArr %s", str(namesArr))
    maxNameLen = max(namesArr)
    log.debug("maxNameLen: %s", maxNameLen)

    for stat in stats.func_stats:
        nameAppendSpaces = [' ' for i in range(maxNameLen - len(stat[0]))]
        log.debug('nameAppendSpaces: %s', nameAppendSpaces)
        blankSpace = ''
        for space in nameAppendSpaces:
            blankSpace += space

        log.debug("adding spaces: %s", len(nameAppendSpaces))
        statPrint = statPrint + str(stat[0]) + blankSpace + " " + str(stat[1]).ljust(8) + "\t" + str(
            round(stat[2], 2)).ljust(8 - len(str(stat[2]))) + "\t" + str(round(stat[3], 2)) + "\n"

    log.log(1000, "\nname" + ''.ljust(maxNameLen - 4) + " ncall \tttot \ttsub")
    log.log(1000, statPrint)

次に、プログラムが機能するときに、startProfilerRPCメソッドを呼び出してプロファイラーをいつでも起動し、呼び出してプロファイリング情報をログファイルにダンプしprintProfiler(またはrpcメソッドを変更して呼び出し元に返す)、次のような出力を取得できます。

2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
name                                                                                                                                      ncall     ttot    tsub
2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
C:\Python27\lib\sched.py.run:80                                                                                                           22        0.11    0.05
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\xmlRpc.py.iterFnc:293                                                22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\serverMain.py.makeIteration:515                                                    22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\PicklingXMLRPC.py._dispatch:66                                       1         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.date_time_string:464                                                                                    1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py._get_raw_meminfo:243     4         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.decode_request_content:537                                                                          1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py.get_system_cpu_times:148 4         0.0     0.0
<string>.__new__:8                                                                                                                        220       0.0     0.0
C:\Python27\lib\socket.py.close:276                                                                                                       4         0.0     0.0
C:\Python27\lib\threading.py.__init__:558                                                                                                 1         0.0     0.0
<string>.__new__:8                                                                                                                        4         0.0     0.0
C:\Python27\lib\threading.py.notify:372                                                                                                   1         0.0     0.0
C:\Python27\lib\rfc822.py.getheader:285                                                                                                   4         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.handle_one_request:301                                                                                  1         0.0     0.0
C:\Python27\lib\xmlrpclib.py.end:816                                                                                                      3         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.do_POST:467                                                                                         1         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.is_rpc_path_valid:460                                                                               1         0.0     0.0
C:\Python27\lib\SocketServer.py.close_request:475                                                                                         1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\__init__.py.cpu_times:1066               4         0.0     0.0 

短いスクリプトにはあまり役立ちませんが、サーバータイプのプロセスを最適化するのに役立ちます。特に、printProfilerメソッドを時間の経過とともに複数回呼び出して、さまざまなプログラムの使用シナリオをプロファイリングおよび比較できる場合に役立ちます。

yappiの新しいバージョンでは、次のコードが機能します。

@staticmethod
def printProfile():
    yappi.get_func_stats().print_all()
5
Aditya Patnaik 2020-05-26 05:07.

IPythonノートブックでクイックプロファイル統計を取得するため。line_profilermemory_profilerをノートブックに直接埋め込むことができます。

もう1つの便利なパッケージはPymplerです。これは、クラス、オブジェクト、関数、メモリリークなどを追跡できる強力なプロファイリングパッケージです。以下の例、ドキュメントを添付。

それを得る!

!pip install line_profiler
!pip install memory_profiler
!pip install pympler

それをロードしてください!

%load_ext line_profiler
%load_ext memory_profiler

これを使って!


%時間

%time print('Outputs CPU time,Wall Clock time') 
#CPU times: user 2 µs, sys: 0 ns, total: 2 µs Wall time: 5.96 µs

与える:

  • CPU時間:CPUレベルの実行時間
  • sys時間:システムレベルの実行時間
  • 合計:CPU時間+システム時間
  • 実時間:実時間

%timeit

%timeit -r 7 -n 1000 print('Outputs execution time of the snippet') 
#1000 loops, best of 7: 7.46 ns per loop
  • ループ(n)回で、指定された実行数(r)から最良の時間を与えます。
  • システムキャッシングの詳細を出力します。
    • コードスニペットが複数回実行されると、システムはいくつかの操作をキャッシュし、それらを再度実行しないため、プロファイルレポートの精度が低下する可能性があります。

%prun

%prun -s cumulative 'Code to profile' 

与える:

  • 関数呼び出しの数(ncalls)
  • 関数呼び出しごとにエントリがあります(個別)
  • 1回の通話にかかる時間(1回の通話)
  • その関数呼び出しまでの経過時間(cumtime)
  • etc ..と呼ばれるfunc / moduleの名前


%memit

%memit 'Code to profile'
#peak memory: 199.45 MiB, increment: 0.00 MiB

与える:

  • メモリ使用量

%lprun

#Example function
def fun():
  for i in range(10):
    print(i)

#Usage: %lprun <name_of_the_function> function
%lprun -f fun fun()

与える:

  • 行ごとの統計


sys.getsizeof

sys.getsizeof('code to profile')
# 64 bytes

オブジェクトのサイズをバイト単位で返します。


pymplerのasizeof()

from pympler import asizeof
obj = [1,2,("hey","ha"),3]
print(asizeof.asizeof(obj,stats=4))

pympler.asizeofを使用して、特定のPythonオブジェクトが消費するメモリ量を調査できます。sys.getsizeofとは対照的に、asizeofはオブジェクトを再帰的にサイズ設定します


pymplerのトラッカー

from pympler import tracker
tr = tracker.SummaryTracker()
def fun():
  li = [1,2,3]
  di = {"ha":"haha","duh":"Umm"}
fun()
tr.print_diff()

関数の存続期間を追跡します。

Pymplerパッケージは、コードをプロファイルするための多数の高ユーティリティ関数で構成されています。ここではすべてをカバーすることはできません。詳細なプロファイルの実装については、添付のドキュメントを参照してください。

Pympler doc

4
Fabio Zadrozny 2015-04-29 12:50.

Pythonでプロファイリングを処理するための新しいツールはPyVmMonitorです。 http://www.pyvmmonitor.com/

それは次のようないくつかのユニークな機能を持っています

  • 実行中の(CPython)プログラムにプロファイラーをアタッチします
  • Yappi統合によるオンデマンドプロファイリング
  • 別のマシンのプロファイル
  • 複数のプロセスのサポート(マルチプロセッシング、django ...)
  • ライブサンプリング/ CPUビュー(時間範囲選択あり)
  • cProfile /プロファイル統合による決定論的プロファイリング
  • 既存のPStatsの結果を分析する
  • DOTファイルを開く
  • プログラムによるAPIアクセス
  • メソッドまたはラインでサンプルをグループ化する
  • PyDev統合
  • PyCharm統合

注:これは商用ですが、オープンソースは無料です。

4
Mattijn 2019-07-20 03:59.

gprof2dot_magic

gprof2dotJupyterLabまたはJupyterNotebookでPythonステートメントをDOTグラフとしてプロファイリングするための魔法の関数。

GitHubリポジトリ: https://github.com/mattijn/gprof2dot_magic

インストール

Pythonパッケージがあることを確認してくださいgprof2dot_magic

pip install gprof2dot_magic

その依存関係gprof2dotgraphviz同様にインストールされます

使用法

マジック機能を有効にするには、最初にgprof2dot_magicモジュールをロードします

%load_ext gprof2dot_magic

次に、ラインステートメントをDOTグラフとしてプロファイルします。

%gprof2dot print('hello world')

3
Colonel Panic 2012-10-14 05:21.

Pythonスクリプトが何をしているのか知りたいと思ったことはありませんか?検査シェルに入ります。Inspect Shellを使用すると、実行中のスクリプトを中断することなく、グローバルを印刷/変更し、関数を実行できます。オートコンプリートとコマンド履歴が追加されました(Linuxのみ)。

Inspect Shellは、pdbスタイルのデバッガーではありません。

https://github.com/amoffat/Inspect-Shell

あなたはそれ(そしてあなたの腕時計)を使うことができます。

3
michael 2015-03-22 03:50.

に追加するには https://stackoverflow.com/a/582337/1070617、

このモジュールを作成したので、cProfileを使用してその出力を簡単に表示できます。詳細はこちら:https://github.com/ymichael/cprofilev

$ python -m cprofilev /your/python/program
# Go to http://localhost:4000 to view collected statistics.

参照: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html 収集された統計を理解する方法について。

3
VishalMishra 2017-04-20 09:42.

それはあなたがプロファイリングから何を見たいかによります。単純な時間メトリックは(bash)で指定できます。

time python python_prog.py

'/ usr / bin / time'でも、 '-verbose'フラグを使用して詳細なメトリックを出力できます。

各関数によって与えられた時間メトリックを確認し、関数に費やされた時間をよりよく理解するために、Pythonで組み込みのcProfileを使用できます。

パフォーマンスなどのより詳細なメトリックに入ると、時間だけがメトリックではありません。あなたは、メモリについてのスレッドなどを心配することができます
プロファイリングオプション:
1. line_profilerは、タイミングメトリックライン・バイ・ラインを見つけるために一般的に使用される別のプロファイラです。
2. memory_profilerは、メモリ使用量をプロファイリングするためのツールです。
3. heapy(プロジェクトGuppyから)ヒープ内のオブジェクトがどのように使用されるかをプロファイルします。

これらは私がよく使うもののいくつかです。しかし、もっと知りたい場合は、この本を読んでみてください。パフォーマンスを念頭に置いて始めるのはかなり良い本です。CythonおよびJIT(Just-in-time)コンパイル済みPythonの使用に関する高度なトピックに進むことができます。

2
Phoenix87 2020-03-14 00:10.

以下のような統計的プロファイラでオースティン、何の計装はあなたが単純でPythonアプリケーションからデータをプロファイリング得ることができることを意味し、必要とされません

austin python3 my_script.py

生の出力はあまり役に立ちませんが、それをflamegraph.plにパイプして、時間(リアルタイムのマイクロ秒で測定)が費やされている場所の内訳を示すデータのフレームグラフ表現を取得できます。

austin python3 my_script.py | flamegraph.pl > my_script_profile.svg
1
z0r 2016-02-12 12:50.

と呼ばれる統計プロファイラーもありstatprofます。これはサンプリングプロファイラーであるため、コードに最小限のオーバーヘッドを追加し、行ベース(関数ベースだけでなく)のタイミングを提供します。ゲームなどのソフトリアルタイムアプリケーションに適していますが、cProfileよりも精度が低い場合があります。

pypiのバージョンは少し古いので、gitリポジトリをpip指定してインストールできます。

pip install git+git://github.com/bos/[email protected]

次のように実行できます。

import statprof

with statprof.profile():
    my_questionable_function()

も参照してください https://stackoverflow.com/a/10333592/320036

1
Ali 2020-02-13 02:03.

pypref_timeから着想を得た独自のプロファイラーを開発しました。

https://github.com/modaresimr/auto_profiler

デコレータを追加すると、時間のかかる関数のツリーが表示されます

@Profiler(depth=4, on_disable=show)

Install by: pip install auto_profiler

import time # line number 1
import random

from auto_profiler import Profiler, Tree

def f1():
    mysleep(.6+random.random())

def mysleep(t):
    time.sleep(t)

def fact(i):
    f1()
    if(i==1):
        return 1
    return i*fact(i-1)


def show(p):
    print('Time   [Hits * PerHit] Function name [Called from] [Function Location]\n'+\
          '-----------------------------------------------------------------------')
    print(Tree(p.root, threshold=0.5))
    
@Profiler(depth=4, on_disable=show)
def main():
    for i in range(5):
        f1()

    fact(3)


if __name__ == '__main__':
    main()

出力例


Time   [Hits * PerHit] Function name [Called from] [function location]
-----------------------------------------------------------------------
8.974s [1 * 8.974]  main  [auto-profiler/profiler.py:267]  [/test/t2.py:30]
├── 5.954s [5 * 1.191]  f1  [/test/t2.py:34]  [/test/t2.py:14]
│   └── 5.954s [5 * 1.191]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
│       └── 5.954s [5 * 1.191]  <time.sleep>
|
|
|   # The rest is for the example recursive function call fact
└── 3.020s [1 * 3.020]  fact  [/test/t2.py:36]  [/test/t2.py:20]
    ├── 0.849s [1 * 0.849]  f1  [/test/t2.py:21]  [/test/t2.py:14]
    │   └── 0.849s [1 * 0.849]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
    │       └── 0.849s [1 * 0.849]  <time.sleep>
    └── 2.171s [1 * 2.171]  fact  [/test/t2.py:24]  [/test/t2.py:20]
        ├── 1.552s [1 * 1.552]  f1  [/test/t2.py:21]  [/test/t2.py:14]
        │   └── 1.552s [1 * 1.552]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
        └── 0.619s [1 * 0.619]  fact  [/test/t2.py:24]  [/test/t2.py:20]
            └── 0.619s [1 * 0.619]  f1  [/test/t2.py:21]  [/test/t2.py:14]
0
Vincent Fenet 2017-02-03 00:18.

サーバーのrootでない場合は、lsprofcalltree.pyを使用して、次のようにプログラムを実行します。

python lsprofcalltree.py -o callgrind.1 test.py

次に、qcachegrindなどのcallgrind互換ソフトウェアでレポートを開くことができます

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

パンデミックは終わったかもしれないが、Covid-19 は終わっていない

2021 年 6 月 8 日にニューヨーク市で開催された covid-19 パンデミックで亡くなった人々の命を偲び、祝うために、ネーミング ザ ロスト メモリアルズが主催するイベントと行進の最中に、グリーンウッド墓地の正門から記念碑がぶら下がっています。週末、ジョー・バイデン大統領は、covid-19 パンデミックの終息を宣言しました。これは、過去 2 年以上にわたり、公の場でそうするための長い列の中で最新のものです。

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

デビル・イン・オハイオの予告編は、エミリー・デシャネルもオハイオにいることを明らかにしています

オハイオ州のエミリー・デシャネル みんな早く来て、ボーンズが帰ってきた!まあ、ショーボーンズではなく、彼女を演じた俳優. エミリー・デシャネルに最後に会ってからしばらく経ちました.Emily Deschanel は、長期にわたるプロシージャルな Bones の Temperance “Bones” Brennan としてよく知られています。

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

ドナルド・トランプはFBIのマー・ア・ラーゴ襲撃映像をリリースする予定ですか?

どうやら、ドナルド・トランプに近い人々は、今月初めにFBIによって家宅捜索された彼のMar-a-Lago財産からの映像を公開するよう彼に勧めています. 前大統領はテープを公開するかどうかを確認していませんが、息子はフォックス・ニュースにそうなるだろうと語った.

Andor は、他の Star Wars ショーから大きな距離を置きます。

Andor は、他の Star Wars ショーから大きな距離を置きます。

アンドールの一場面。数十年前、ジョージ・ルーカスがスター・ウォーズのテレビ番組を制作するのを妨げた主な理由は、お金でした。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language