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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

この太陽に優しいショルダーバッグで一日中外出してください

この太陽に優しいショルダーバッグで一日中外出してください

画像クレジット:Richard Mackney / Flickrトラベリングライトは必需品だけを運ぶことを意味するかもしれませんが、デバイスを補充する方法がない外出先では、接続を維持するのが難しくなる可能性があります。それはあなたがすべての生き物の快適さやクールなガジェットを捨てる必要があるという意味ではありません、ただあなたがいくつかのより小さなものを手に入れる必要があるということです、そしておそらくあなた自身をジュースに保つためにいくつかの、例えば非正統的な充電装置を使うでしょう。

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ミッドセンチュリーリゾートのポストカードが廃墟に変わるのを見る

ニューヨーク州スプリンググレンにある放棄されたホモワックロッジのボーリング場。キャッツキル南部のこの地域は、ニューヨーク市からのユダヤ人の行楽客に人気があることから、かつてはボルシチベルトとして知られていました。

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートの美しいボードをあなたのテーブルに座らせましょう

ブルックリンスレートブルックリンスレートのマグカップとコースターの賞賛をすでに歌っており、それらの食器製品も同様に堅実です。ブルックリンスレートは、さまざまなサイズとテクスチャのスレートの完全な採石場を販売しています。一部のオプションは赤でも利用できます。上で見ることができるように、彼らは同様にカスタマイズをします。

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

遺伝子分析により、私たちの体内に生息する微生物の99%がカタログ化されていないことが明らかになりました

画像:Juan Gaertner / Shutterstock私たちの体の内部は、私たちの細胞とは何の関係もない何十億もの微生物が住んでいる本物の生態系です。これがまだ少し気になることではなかったかのように、これらの微生物の99%が研究されたことがないことがわかりました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language