2013-05-16 31 views
6

私はクラスメソッドの時間とメモリ使用量をプロファイリングしたいと思います。私はこれのためのボックス・ソリューションを見つけられませんでした(このようなモジュールはありますか?)、私はtimeitを時間プロファイリングに、memory_usagememory_profilerモジュールに使用することに決めました。memory_profiler(pythonモジュール)をクラスメソッドで使用するには?

memory_profilerでプロファイリングメソッドの問題に直面しました。私はさまざまな変種を試しましたが、どれも変わっていませんでした。

私はfunctoolsから部分的に使おうとすると、私はこのエラーを取得:

File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 126, in memory_usage 
    aspec = inspect.getargspec(f) 
File "/usr/lib64/python2.7/inspect.py", line 815, in getargspec 
    raise TypeError('{!r} is not a Python function'.format(func)) 
TypeError: <functools.partial object at 0x252da48> is not a Python function 

ところで、まったく同じアプローチがtimeit機能が正常に動作します。

私はこのエラーを得たとしてlambdaを使用しよう:

File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 141, in memory_usage 
    ret = parent_conn.recv() 
IOError: [Errno 4] Interrupted system call 

は、どのように私はmemory_profilerとクラスメソッドを扱うことができますか?

PS:私にはメモリプロファイラ(0.26)(ピップでインストール)があります。

UPD:実際はバグです。ここでステータスを確認できます:https://github.com/fabianp/memory_profiler/issues/47

答えて

5

Python VMに割り当てられたメモリの変更を確認するには、psutilを使用できます。ここでは、メモリの変化を表示しますpsuilを使用した簡単なデコレータは次のとおりです。すべての可能性で

import functools 
import os 
import psutil 


def print_memory(fn): 
    def wrapper(*args, **kwargs): 
     process = psutil.Process(os.getpid()) 
     start_rss, start_vms = process.get_memory_info() 
     try: 
      return fn(*args, **kwargs) 
     finally: 
      end_rss, end_vms = process.get_memory_info() 
      print((end_rss - start_rss), (end_vms - start_vms)) 
    return wrapper 


@print_memory 
def f(): 
    s = 'a'*100 

、あなたが表示されます出力は、メモリ内に何の変化も言わないだろう。これは、小さな割り当ての場合、Python VMがOSからより多くのメモリを要求する必要がないためです。

import numpy 
@print_memory 
def f(): 
    return numpy.zeros((512,512)) 

は、ここでは、メモリ内のいくつかの変更が表示されるはずです。あなたが大規模な配列を割り当てた場合は、別の何かが表示されます。

あなたがそれぞれ割り当てられたオブジェクトによって使用されているどのくらいのメモリを参照したい場合は、私の知っている唯一のツールがheapy

ある
In [1]: from guppy import hpy; hp=hpy() 

In [2]: h = hp.heap() 

In [3]: h 
Out[3]: 
Partition of a set of 120931 objects. Total size = 17595552 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 57849 48 6355504 36 6355504 36 str 
    1 29117 24 2535608 14 8891112 51 tuple 
    2 394 0 1299952 7 10191064 58 dict of module 
    3 1476 1 1288416 7 11479480 65 dict (no owner) 
    4 7683 6 983424 6 12462904 71 types.CodeType 
    5 7560 6 907200 5 13370104 76 function 
    6 858 1 770464 4 14140568 80 type 
    7 858 1 756336 4 14896904 85 dict of type 
    8 272 0 293504 2 15190408 86 dict of class 
    9 304 0 215064 1 15405472 88 unicode 
<501 more rows. Type e.g. '_.more' to view.> 

私は長い時間でそれを使用していないので、私は試しと読書をお勧めしますドキュメンテーション大量のメモリを使用するアプリケーションでは、この情報を計算するのが非常に遅いことに注意してください。

+0

ありがとうございます。わかった。できます。 – rominf

関連する問題