ठीक है। जो मैं वास्तव में खोज रहा था वह अस्तित्व में प्रतीत नहीं होता है। इसलिए, मुझे एक समाधान मिला - इस समस्या के लिए एक समाधान।
मेमोरी प्रोफाइल करने के बजाय, मैं ऑब्जेक्ट्स प्रोफाइल करूंगा। इस तरह, मैं देख सकता हूं कि कार्यक्रम में किसी विशिष्ट समय पर कितनी वस्तुएं मौजूद हैं। मेरे लक्ष्य को प्राप्त करने के लिए, मैंने मेटाक्लास का उपयोग पहले से ही मौजूदा कोड में न्यूनतम संशोधन के साथ किया है।
निम्नलिखित मेटाक्लास क्लास के __init__
और __del__
कार्यों में एक बहुत ही सरल सबराउटिन जोड़ता है। __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
डमीफंक्शन केवल एक बहुत ही सरल कामकाज है। मुझे यकीन है कि ऐसा करने के लिए बेहतर तरीके हैं।
अंत में, जब भी आप मौजूद वस्तुओं की संख्या देखना चाहते हैं, तो आपको काउंटर डिक्शनरी को देखने की आवश्यकता है। एक उदाहरण;
>>> 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
@ फाल्मररी, मैं एक 'मेमोरी' प्रोफाइलर की तलाश में हूं। पहला मुख्य रूप से एक सीपीयू प्रोफाइलर है। दूसरा एक केवल एक धागे के लिए काम करता है। –
धागे की मुख्य विशेषता यह है कि वे स्मृति साझा करते हैं (प्रक्रियाओं के विपरीत)। आप सभी समान स्मृति साझा करने वाले धागे के लिए अलग-अलग मेमोरी आंकड़ों को प्रोफ़ाइल करने की अपेक्षा कैसे करते हैं? – scoffey