メモリ使用量を監視してボトルネックを発見しやすくする。
Anacondaやpipでインストールするだけ。依存するpsutilも同時に入る。
> conda install memory_profiles
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使うことがわかる。