目次

memory_profiles

メモリ使用量を監視してボトルネックを発見しやすくする。

インストール

Anacondaやpipでインストールするだけ。依存するpsutilも同時に入る。

> conda install memory_profiles

Windowsでの注意

pythonでファイルを開くとき、デフォルトのエンコード方式はシステム依存。Windows7日本版では'cp932'(shift-jisの一種)

なので、utf-8などで書かれたテキスト(ascii外文字を含むもの)を何も指定せず読み込むと、UnicodeDecodeErrorが発生する。

memory_profiles(ver.0.41)のモジュール内では、何も指定せずファイルを開いている箇所が存在する。

ファイルを書き換えて、エンコードを指定する。アップデートのたびに書き換わってしまうが、プログラム上からデフォルトエンコードを変える方法がよくわからなかった。スクリプトファイルの方をshift-jisに合わせても問題は一応解決するが、それも変だし。

if PY3:
    def exec_with_profiler(filename, profiler):
        builtins.__dict__['profile'] = profiler
        # shadow the profile decorator defined above
        ns = dict(_CLEAN_GLOBALS, profile=profiler)
        with open(filename, encoding='utf-8') as f:  # ←ここに、左のようにencoding='utf-8'を加える
            exec(compile(f.read(), filename, 'exec'), ns, ns)

使い方

デバッグしたい関数を@profileでデコレート

@profile
def test():
    a = list(range(100000))

if __name__ == '__main__':
    test()

pythonで、モジュールを指定して実行

> python -m memory_profiles test.py

Filename: D:/Tago/Projects-python/etc20/trivial/memory.py

Line #    Mem usage    Increment   Line Contents
================================================
     8   28.309 MiB    0.000 MiB   @profile
     9                             def test():
    10   32.176 MiB    3.867 MiB       a = list(range(100000))

10万要素の整数リストは、およそ4MB使うことがわかる。