2011-10-15 40 views
6
>>> sys.getsizeof(int) 
436 #? does this mean int occupies 436 bytes . 

>>> sys.getsizeof(1) 
12 #12 bytes for int object, is this the memory requirement. 

Tôi nghĩ int trong python được đại diện bởi 4 byte, tại sao là nó báo cáo 12 byteLàm thế nào tôi có thể xác định kích thước chính xác của một loại được sử dụng bởi python

Xin vui lòng ai giải thích tại sao nó báo cáo 12 byte khi int chỉ sử dụng 4 byte

+0

bản sao có thể có của [Làm cách nào để sử dụng bộ nhớ hồ sơ bằng Python?] (Http://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python) –

+0

Ngoài ra, [ cái này] (http://stackoverflow.com/questions/110259/python-memory-profiler). Về cơ bản, công cụ liên kết ở đó (Heapy) là một phần của một luận án về lược tả bộ nhớ trong Python. Nếu bạn thực sự muốn biết, hãy kiểm tra. –

Trả lời

10

Có, trường hợp int chiếm 12 byte trên hệ thống của bạn. Số nguyên (giống như bất kỳ đối tượng nào) có thuộc tính, tức là con trỏ đến các đối tượng khác, chiếm thêm không gian bộ nhớ ngoài không gian được sử dụng bởi giá trị của đối tượng. Vì vậy, 4 byte cho giá trị của số nguyên, 4 byte cho một con trỏ đến __class__ (nếu không, Python sẽ không biết loại đối tượng thuộc về và cách bắt đầu phân giải tên thuộc tính được thừa kế từ lớp int và cha mẹ của nó) 4 cho số tham chiếu của đối tượng, được sử dụng bởi bộ thu gom rác.

Loại int chiếm 436 byte trên hệ thống của bạn, đó sẽ là con trỏ đến các phương pháp khác nhau và các thuộc tính khác của lớp int và bất kỳ thông tin vệ sinh nào khác mà Python yêu cầu cho lớp học. Lớp int được viết bằng C trong triển khai Python chuẩn; bạn có thể xem mã nguồn và xem nội dung trong đó.

+1

những gì một cứu trợ .... cảm ơn vì đã giải thích. – George

+0

Python không lưu trữ các số nguyên (đủ nhỏ) bằng cách sử dụng một bit đặc biệt trong con trỏ đối tượng như một số ngôn ngữ khác (ruby, một số lisps), vì vậy chúng sử dụng khá nhiều bộ nhớ cho các int đơn giản. Nếu 12 byte là quá nhiều cho bạn, và bạn muốn lưu trữ các mảng lớn của ints, hãy nhìn vào mảng đặc biệt của numpy. –

+0

@eryksun: Hoặc suy nghĩ về hiệu suất trung bình của 'array.append' sẽ như thế nào nếu nó không phân bổ quá mức hoặc đọc nguồn (arraymodule.c). –

2

Từ tài liệu cho sys.getsizeof:

getsizeof() gọi phương thức của đối tượng __sizeof__ và thêm thêm overhead thu gom rác nếu đối tượng được quản lý bởi các nhà sưu tập rác.

Đó có thể là lý do tại sao sys.getsizeof(1) cung cấp cho bạn 12 byte. Đối với dòng đầu tiên của bạn, hãy ghi nhớ những gì đối tượng int là:

>>> int 
<type 'int'> 

int là kiểu số nguyên chính nó, và không phải là một số nguyên. Một số nguyên trong python thực sự chiếm nhiều byte như nó cần (đó là lý do tại sao bạn không cần phải lo lắng về tràn), trong khi kiểu là nơi tất cả các chức năng đó được xử lý. Tôi tin rằng sự khác biệt này chỉ hợp lệ đối với các kiểu dựng sẵn và đối với các đối tượng do người dùng xác định, chính loại đó có thể có kích thước tương tự như một thể hiện của loại đó.

Các vấn đề liên quan