`sys.getsizeof()` does not include inline values
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 35.9k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Bug report
Bug description:
Commit tested: 5e65a1acc0b
I have a program that allocates numerous instances of this type:
@dataclass
class Node:
cdr: Self | None
BIG_DATA = None
for i in range(50):
BIG_DATA = Node(BIG_DATA)
print(sys.getsizeof(BIG_DATA))
After the 28th iteration, I find that it stabilizes at printing 48. But if I run the program in GDB and trace the actual allocations, I see that it is allocating 80 bytes per iteration:
# Set a GDB-recognized breakpoint
os.kill(os.getpid(), signal.SIGTRAP)
# In GDB:
# b _PyObject_Malloc
# commands
# silent
# print nbytes
# continue
# end
for i in range(50):
BIG_DATA = Node(BIG_DATA)
I believe that the missing bytes can be accounted for in the inline values. I observe the same behavior on Python 3.13.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-128763
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với hành vi đã được báo cáo của sys.getsizeof() và tái hiện ví dụ dataclass Node, đồng thời so sánh đầu ra của nó với trace _PyObject_Malloc trong GDB. Điều tra cách các giá trị inline được tính; công việc được xem là hoàn tất khi kích thước được báo cáo phản ánh các lần cấp phát được thể hiện trong ví dụ mà không làm hồi quy hành vi hiện có.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- backend, performance
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 25/100