2012年9月29日

Python で実行時メモリを計測する場合 memory_profiler を利用すると便利

概要

Python でメモリの利用量が知りたい場合、「memory_profiler」を使うと便利。
ライセンスはBSDで、Python 3 にも対応している。

インストール

pip でインストールする。psutilもインストールすると速度が早くなるのでインストールする。

pip install psutil
pip install memory_profiler

使い方

以下の使いかたは、「memory_profiler」に書いてあることそのまま。
計測したいメソッドに「@profile」を付けて、「memory_profiler」を利用して実行する。

sample.py の名前で以下のファイルを作成。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

@profile
def main():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == '__main__':
    main()

以下のように実行する。

python -m memory_profiler sample.py

出力は以下のようになる。一行ずつ実行した時点でのメモリ総量、メモリ増減量とかを表示する。

Filename: sample.py

Line #    Mem usage    Increment   Line Contents
================================================
     4                             @profile
     5      8.19 MB      0.00 MB   def main():
     6     15.82 MB      7.63 MB       a = [1] * (10 ** 6)
     7    168.41 MB    152.59 MB       b = [2] * (2 * 10 ** 7)
     8     15.82 MB   -152.59 MB       del b
     9     15.82 MB      0.00 MB       return a

ipythonで使う

設定するとipythonから使うことも可能。
「 ~/.ipython/extensions/memory_profiler_ext.py」に以下のファイルを作成。

import memory_profiler

def load_ipython_extension(ip):
    ip.define_magic('mprun', memory_profiler.magic_mprun)
    ip.define_magic('memit', memory_profiler.magic_memit)

「 ~/.ipython/profile_default/ipython_config.py」の該当箇所に以下を追加。

c.TerminalIPythonApp.extensions = [
    'memory_profiler_ext',
]
c.InteractiveShellApp.extensions = [
    'memory_profiler_ext',
]

これを設定することで、ipythonで「python -m memory_profiler」と同じことが「%mprun」で可能になる。
また「%memit」に続けて書くことで、メモリ計測が可能。

その他

ほかにも help で見るといろいろ説明が書いてあるが、このぐらいの機能しか使っていない。今後もうすこし使ってみるかもしれない。

blog comments powered by Disqus