2013-07-10 37 views
7

Khi tôi chạy mã dưới đây tôi nhận được 3 và 36 là câu trả lời.Sự khác nhau giữa phương thức len() và sys.getsizeof() trong python là gì?

x ="abd" 
print len(x) 
print sys.getsizeof(x) 

Bất kỳ ai có thể giải thích cho tôi sự khác nhau giữa chúng là gì?

+6

bạn đã tra cứu tài liệu chưa? – moooeeeep

+0

@moooeeeep: Có lẽ OP cho rằng các chuỗi Python giống như các chuỗi C; một byte cho mỗi ký tự, cộng với một byte rỗng. –

+1

Không chắc chắn tại sao điều này đã bị đóng. 2 năm sau câu trả lời là chính xác những gì tôi đang tìm kiếm và IMO rất phù hợp với bất cứ ai cần hiểu kích thước chuỗi. – Realistic

Trả lời

34

Chúng không giống nhau ở tất cả.

len() truy vấn cho số lượng mục có trong vùng chứa. Đối với chuỗi là số ký tự:

Trả về độ dài (số mục) của một đối tượng. Đối số có thể là một chuỗi (chuỗi, tuple hoặc danh sách) hoặc ánh xạ (từ điển).

sys.getsizeof() mặt khác trả về kích thước bộ nhớ của đối tượng:

Return kích thước của một đối tượng trong byte. Đối tượng có thể là bất kỳ loại đối tượng nào. Tất cả các đối tượng tích hợp sẵn sẽ trả lại kết quả chính xác, nhưng điều này không phải giữ đúng cho các phần mở rộng của bên thứ ba vì nó được thực hiện cụ thể.

Đối tượng chuỗi Python không phải là chuỗi ký tự đơn giản, 1 byte cho mỗi ký tự.

Cụ thể, sys.getsizeof() chức năng bao gồm các chi phí thu gom rác nếu có:

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.

Đối tượng chuỗi không cần phải được theo dõi (chúng không thể tạo tham chiếu vòng tròn), nhưng đối tượng chuỗi cần nhiều bộ nhớ hơn chỉ số byte cho mỗi ký tự. Trong Python 2, __sizeof__ phương pháp lợi nhuận (trong mã C):

Py_ssize_t res; 
res = PyStringObject_SIZE + PyString_GET_SIZE(v) * Py_TYPE(v)->tp_itemsize; 
return PyInt_FromSsize_t(res); 

nơi PyStringObject_SIZE là C struct kích thước tiêu đề cho các loại hình, PyString_GET_SIZE về cơ bản cũng giống như len()Py_TYPE(v)->tp_itemsize là kích thước mỗi ký tự. Trong Python 2.7, đối với chuỗi byte, kích thước cho mỗi ký tự là 1, nhưng nó là PyStringObject_SIZE gây nhầm lẫn cho bạn; trên máy Mac của tôi rằng kích thước là 37 byte:

>>> sys.getsizeof('') 
37 

Đối unicode chuỗi kích thước mỗi nhân vật đi lên đến 2 hoặc 4 (tùy thuộc vào tùy chọn biên dịch). Trên Python 3.3 và mới hơn, chuỗi Unicode chiếm từ 1 đến 4 byte cho mỗi ký tự, tùy thuộc vào nội dung của chuỗi.

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