5つの方法pythonプログラムコードの性能分析とタイミング統計を行う

3891 ワード

pythonコード実行時間統計
以下の方法では,コードブロック,コードプログラムファイル,関数についてそれぞれ性能タイミング統計を行う.
一、time.time()またはdatetime.datetime.now()
現在の時刻を返すタイムスタンプは、1524302,633.98187の2回の時間のように減少し、コード実行に必要な時計掛け時間、すなわちコマンドの実行開始から終了までの時間である.
import time
start = time.time()
print("Hello World")
time.sleep(2)
end = time.time()
print(end - start)

しゅつりょく
Hello World
2.0038700103759766

二、time.clock()
clock()関数は、浮動小数点数で計算された秒数で現在のCPU時間を返します.異なるプログラムの時間を測定するために使用する、time.time()の方が役に立ちます.winシステムでは,この関数は実時間(wall time)を返し,Unix/LinuxではCPU時間を返す.
#   test.py
import time
start = time.clock()
print("Hello World")
time.sleep(2)
end = time.clock()
print(end - start)

linux下出力
Hello World
 0.00020299999999999485

time.clock()は、python 3.3バージョン以降、この関数は廃棄されましたが、この関数は使用できます.
三、time
linuxの下でプログラム全体に対して時間統計time python testをします.py timeコマンドが間違っている場合は、timeではなく/usr/bin/timeを使用できます.
/usr/bin/time -p python test.py

出力内容real 0 m 2.057s user 0m0.033s sys 0m0.011s
realは,全体の消費時間userを記録し,CPUがタスクに費やした時間を記録したが,カーネル関数に費やした時間sysを含まずカーネル関数に費やした時間をuserとsysに加算してCPUが合計した時間を記録した.この時間とrealの差はIO待ちに費やされる可能性がある.
-verboseスイッチをオンにすると、より多くの出力情報を得ることができます/usr/bin/timee--verbose python test.py
四、cProfile
cProfile:lsprofに基づくC言語で実現された拡張応用は、実行コストが比較的合理的で、実行時間の長いプログラムを分析するのに適しており、このモジュールの使用を推奨する.python -m cProfile test.py python -m cProfile -o profile.stats test.py統計ファイルを生成しpythonによりimport pstats p=pstatsを解析する.Stats(“profile.stats”) p.print_stats()
Hello World
0.00010600000000000193
         8 function calls in 2.005 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.005    2.005 test.py:3()
        1    0.000    0.000    2.005    2.005 {built-in method builtins.exec}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.print}
        2    0.000    0.000    0.000    0.000 {built-in method time.clock}
        1    2.005    2.005    2.005    2.005 {built-in method time.sleep}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

ncalls:関数呼び出しの回数を表します.tottime:指定した関数の総実行時間を表し、関数でサブ関数を呼び出す実行時間を除く.percall:(最初のpercall)はtottime/ncallsに等しい.Cumtime:この関数とそのすべてのサブ関数の呼び出しが実行された時間、すなわち関数が戻りに呼び出された時間を表す.percall:(2番目のpercall)関数が1回実行される平均時間であり、cumtime/ncallsに等しい.filename:lineno(function):各関数呼び出しの具体的な情報;
runsnakerunでcProfileの出力を可視化pip install runsnakeでインストールするにはwxPythonが必要でvirtualenvでインストールするのは面倒です.試したことがないので、記録します.書籍『python高性能プログラミング』より
五、timeit
from timeit import timeit

timeit('math.sqrt(2)', 'import math', number=100000)

六、装飾器–関数を計時統計する
デザイナtimethisを定義デザイナを関数定義の前に置くと、対応する関数のタイミング情報が得られます.
from functools import wraps
import time

def timethis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        r = func(*args, **kwargs)
        end = time.perf_counter()
        print('{}.{} : {}'.format(func.__module__, func.__name__, end - start))
        return r
    return wrapper

@timethis
def ts():
    time.sleep(2)
    print("Hello World")

ts()

ハローワールドmainを出力します.ts : 2.0007375059940387
七、lineでprofilerによる逐行分析
cProfileで分析する関数を見つけ、line_を使用します.profilerは関数を解析します.line_profilerは関数のパフォーマンスを1行1行分析できますpip install line_profiler
kernprofを実行する被修飾関数のCPUオーバーヘッドkernprofを逐行分析する.py -l -v test.py-v表示出力-lは関数単位ではなく逐行分析を表す
Total Time:テストコードの総実行時間Hits:行ごとのコード実行回数を表すTime:行ごとのコード実行の総時間Per Hits:行ごとのコード実行時間%Time:行ごとのコード実行時間のパーセント
コメント
timeを使う.perf_counter()は、所与のプラットフォームで最も精度の高いタイマを提供することができるが、計算されるのはクロック時間であり、機械負荷などの精度に影響を与える要素が多い.実行時間に興味がある場合はtimeを使用します.process_time()が代わります.