行。我正在寻找的东西似乎并不存在。所以,我找到了一个解决方案——一个解决这个问题的方法。
我将分析对象,而不是分析内存。这样,我将能够查看程序中特定时间存在多少对象。为了实现我的目标,我使用了对现有代码进行最少修改的元类。
下面的元类为该类添加了一个非常简单的子例程__init__
和__del__
函数。for 子例程__init__
将具有该类名称的对象的数量增加一并__del__
减少一。
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}
我希望这可以帮助你。这对我的情况来说已经足够了。