Ok. Những gì tôi đã tìm kiếm chính xác dường như không tồn tại. Vì vậy, tôi đã tìm thấy giải pháp-giải pháp cho vấn đề này.
Thay vì bộ nhớ hồ sơ, tôi sẽ cấu hình các đối tượng. Bằng cách này, tôi sẽ có thể thấy có bao nhiêu đối tượng tồn tại tại một thời điểm cụ thể trong chương trình. Để đạt được mục tiêu của mình, tôi đã sử dụng metaclasses với sự sửa đổi tối thiểu cho mã đã tồn tại.
Siêu dữ liệu sau đây thêm một chương trình con rất đơn giản cho các hàm __init__
và __del__
của lớp. Chương trình con cho số __init__
tăng số lượng đối tượng có tên lớp đó lên một và số __del__
giảm một.
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
Hàm incAndCall và decAndCall sử dụng biến toàn cầu của mô-đun mà chúng tồn tại.
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
Hàm giả chỉ là giải pháp rất đơn giản. Tôi chắc chắn có nhiều cách tốt hơn để làm điều đó.
Cuối cùng, bất cứ khi nào bạn muốn xem số lượng đối tượng tồn tại, bạn chỉ cần xem từ điển truy cập. Một ví dụ;
>>> 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}
Tôi hy vọng điều này sẽ giúp ích cho bạn. Đó là đủ cho trường hợp của tôi.
Bạn không thích điều gì về giải pháp trong các câu hỏi khác? – Falmarri
@Falmarri, tôi đang tìm kiếm một bộ nhớ 'profiler'. Đầu tiên chủ yếu là một trình biên dịch CPU. Cái thứ hai chỉ hoạt động cho một sợi đơn. –
Các tính năng chính của chủ đề là họ chia sẻ bộ nhớ (trái ngược với quy trình). Làm thế nào để bạn mong đợi để cấu hình số liệu thống kê bộ nhớ khác nhau cho các chủ đề chia sẻ tất cả cùng một bộ nhớ? – scoffey