サブロウ丸

主にプログラミングと数学

Python パフォーマンス計測

pythonプログラムのパフォーマンス、ここでは
1. 行単位の実行時間と実行頻度
2. 行単位のメモリ使用量
を調べる方法を紹介します。
参考ページ(Pythonスクリプトのパフォーマンス計測ガイド | Yakst)

行単位の実行時間と実行頻度

line_profilerモジュールを使います。
1. インストール
pip3 install line_profiler

2. 使用方法
Python sorting外観 - サブロウ丸
上記のソーティング関数を例に、使ってみたいと思います。

sample.py

from random import randint

@profile
def bubble_sort(a):
    n = len(a)
    for i in range(n-1):
        for j in range(n-i-1):
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
    return a

@profile
def shell_sort(a):
    n = len(a)
    gap, i, h = [], 1, 1
    while h < n:
        gap.append(h)
        h = (3**i+1)//2
        i = i + 1

    for h in gap[::-1]:
        for i in range(h, n):
            key, j = a[i], i
            while j > 0 and a[j-h] > key:
                a[j-h]= a[j]
                j = j - h
        a[j] = key
    return a

if __name__ == '__main__':
    n = 1000
    a = [randint(0, 100) for _ in range(n)]
    bubble_sort(a)
    shell_sort(a)

計測したい関数の前に@profileをつけるだけで準備はOKです。 後はこのスクリプト
kernprof -l -v sample.py で実行するだけです。
結果の出力は以下の通り。
f:id:inarizuuuushi:20161217211931p:plain f:id:inarizuuuushi:20161217211924p:plain
ね。面白いですね。これからHIt数や処理時間が長い行を発見することができます。



行単位のメモリ使用量

memory_profilerモジュールを使います。
1. インストール
pip3 install memory_profiler psutil

2. 使用方法
こちらもline_profilerのときと同様に、調べたい関数の前に@profileをつけるだけで準備はOKです。
python3 -m memory_profiler sample.pyで実行
結果の出力は
f:id:inarizuuuushi:20161217212610p:plain f:id:inarizuuuushi:20161217212622p:plain こんな感じです。