私が正確に探していたものは存在していないようです。だから、私は解決策を見つけました。この問題の回避策です。
メモリをプロファイリングする代わりに、私はオブジェクトをプロファイルします。このようにして、プログラムの特定の時間にいくつのオブジェクトが存在するかを見ることができます。私の目標を達成するために、既存のコードを最小限に変更してメタクラスを使用しました。
次のメタクラスは、クラスの__init__
と__del__
関数に非常に単純なサブルーチンを追加します。 __init__
のサブルーチンは、そのクラス名を持つオブジェクトの数を1つ増やし、__del__
を1つ減らします。
class ObjectProfilerMeta(type):
#Just set metaclass of a class to ObjectProfilerMeta to profile object
def __new__(cls, name, bases, attrs):
if name.startswith('None'):
return None
if "__init__" in attrs:
attrs["__init__"]=incAndCall(name,attrs["__init__"])
else:
attrs["__init__"]=incAndCall(name,dummyFunction)
if "__del__" in attrs:
attrs["__del__"]=decAndCall(name,attrs["__del__"])
else:
attrs["__del__"]=decAndCall(name,dummyFunction)
return super(ObjectProfilerMeta, cls).__new__(cls, name, bases, attrs)
def __init__(self, name, bases, attrs):
super(ObjectProfilerMeta, self).__init__(name, bases, attrs)
def __add__(self, other):
class AutoClass(self, other):
pass
return AutoClass
incAndCallとdecAndCall機能
は、それらが存在するモジュールのグローバル変数を使用する使用します。
counter={}
def incAndCall(name,func):
if name not in counter:
counter[name]=0
def f(*args,**kwargs):
counter[name]+=1
func(*args,**kwargs)
return f
def decAndCall(name,func):
if name not in counter:
counter[name]=0
def f(*args,**kwargs):
counter[name]-=1
func(*args,**kwargs)
return f
def dummyFunction(*args,**kwargs):
pass
dummyFunctionは単なる非常に簡単な回避策です。私はそれを行うより良い方法があると確信しています。
最後に、存在するオブジェクトの数を確認したいときは、カウンタディクショナリを参照するだけです。例;
>>> class A:
__metaclass__=ObjectProfilerMeta
def __init__(self):
pass
>>> class B:
__metaclass__=ObjectProfilerMeta
>>> l=[]
>>> for i in range(117):
l.append(A())
>>> for i in range(18):
l.append(B())
>>> counter
{'A': 117, 'B': 18}
>>> l.pop(15)
<__main__.A object at 0x01210CB0>
>>> counter
{'A': 116, 'B': 18}
>>> l=[]
>>> counter
{'A': 0, 'B': 0}
私はこれがあなたを助けてくれることを願っています。私の場合は十分でした。
これらの他の質問の解決策について、あなたはどう思われますか? – Falmarri
@Falmarri、私は 'メモリ'プロファイラを探しています。最初は主にCPUプロファイラです。 2番目のスレッドは、1つのスレッドに対してのみ機能します。 –
スレッドの主な特徴は、(プロセスとは対照的に)メモリを共有することです。同じメモリを共有するスレッドに対して、どのように異なるメモリ統計をプロファイルすると思いますか? – scoffey