Khi chúng tôi đang viết các tập lệnh lớn hoặc mã nhiều dòng, việc quản lý bộ nhớ phải là ưu tiên hàng đầu của chúng tôi. Do đó, chúng ta cần có kiến thức tốt về xử lý bộ nhớ hiệu quả bên cạnh kiến thức lập trình tốt. Chúng tôi có nhiều hàm được cung cấp trong Python để lấy kích thước trong bộ nhớ của một đối tượng cụ thể có trong chương trình và một trong những hàm đó là __sizeof__[]. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về hàm __sizeof__[] và cách nó hoạt động bên trong chương trình Python
Hàm __sizeof__[] trong Python
Hàm __sizeof__[] trong Python không cho chúng ta biết chính xác kích thước của đối tượng. Nó không trả về kích thước của đối tượng trình tạo vì Python không thể cho chúng tôi biết trước kích thước của trình tạo là bao nhiêu. Tuy nhiên, trên thực tế, nó trả về kích thước bên trong cho một đối tượng cụ thể [tính bằng byte] chiếm bộ nhớ
Để hiểu điều này, chúng ta hãy xem chương trình ví dụ sau với một đối tượng trình tạo vô tận
ví dụ 1. Nhìn vào chương trình Python sau
đầu ra
Internal memory size of endless generator object: 120
Giải trình
Chúng tôi đã sử dụng một chức năng mặc định, tôi. e. , EndlessGenerator[], để tạo một đối tượng trình tạo vô tận trong chương trình. Trong hàm, chúng ta đã khởi tạo một biến, i. e. , đếm = 0. Chúng tôi đã sử dụng vòng lặp while trên biến đếm mà không đưa ra điểm dừng trên vòng lặp. Bằng cách tạo một vòng lặp vô hạn trong hàm, chúng ta đã biến hàm mặc định thành một đối tượng trình tạo vô tận. Cuối cùng, chúng tôi đã in kích thước bộ nhớ trong của đối tượng trình tạo vô tận bằng cách sử dụng hàm __sizeof__[]
Bây giờ, chúng ta có thể hiểu rõ chức năng của hàm __sizeof__[]. Vì đối tượng trình tạo vô tận trong chương trình trên không có bất kỳ điểm kết thúc hoặc điểm ngắt nào, nên Python không thể cho chúng tôi biết trước kích thước của trình tạo. Nhưng đồng thời, chúng ta có thể kiểm tra kích thước bộ nhớ trong được phân bổ cho đối tượng trình tạo bằng hàm __sizeof__[] vì nó phải chiếm một số bộ nhớ trong trong Python
Hãy xem thêm một ví dụ nơi chúng ta sử dụng hàm __sizeof__[] để lấy kích thước bộ nhớ trong mà không cần bất kỳ chi phí nào
ví dụ 2
đầu ra
Internal memory size of an empty list: 40 Memory size of first list: 48 Memory size of second list: 104 Memory size of third list: 104 Memory size of fourth list: 136
Giải trình
Sử dụng hàm __sizeof__[], chúng ta có thể thấy rõ rằng kích thước bộ nhớ trong của danh sách trống là 40 byte và mọi phần tử có trong danh sách sẽ thêm kích thước 8 byte vào tổng kích thước bộ nhớ của danh sách
Các hàm này tăng TypeError
khi mong đợi tham số byte và được gọi với tham số không phải byte
Loại con này của PyObject
đại diện cho một đối tượng byte Python
Một phần của ABI ổn định< . .
Phiên bản này của PyTypeObject
đại diện cho loại byte Python;
Return true if the object o is a bytes object or an instance of a subtype of the bytes type. This function always succeeds.
int PyBytes_CheckExact[PyObject *o]¶Return true if the object o is a bytes object, but not an instance of a subtype of the bytes type. This function always succeeds.
Return value: New reference. Part of the ABI ổn định .
Trả về một đối tượng byte mới với một bản sao của chuỗi v làm giá trị khi thành công và NULL
khi thất bại. Tham số v không được là NULL
;
Return value: New reference. Part of the ABI ổn định .
Trả về một đối tượng byte mới với một bản sao của chuỗi v làm giá trị và độ dài len nếu thành công và NULL
nếu thất bại. Nếu v là NULL
, nội dung của đối tượng bytes chưa được khởi tạo
Giá trị trả về. Tài liệu tham khảo mới. Một phần của ABI ổn định .
Lấy một chuỗi định dạng kiểu C
Internal memory size of an empty list: 40 Memory size of first list: 48 Memory size of second list: 104 Memory size of third list: 104 Memory size of fourth list: 1360 và một số đối số có thể thay đổi, tính toán kích thước của đối tượng bytes Python kết quả và trả về một đối tượng bytes với các giá trị được định dạng trong đó. Các đối số biến phải là loại C và phải tương ứng chính xác với các ký tự định dạng trong chuỗi định dạng. Các ký tự định dạng sau được cho phép
định dạng ký tự
Loại hình
Bình luận
Internal memory size of an empty list: 40 Memory size of first list: 48 Memory size of second list: 104 Memory size of third list: 104 Memory size of fourth list: 1361
không có
Ký tự % theo nghĩa đen
PyObject
0
int
Một byte đơn, được biểu thị dưới dạng C int
PyObject
1
int
Tương đương với PyObject
2. 1
PyObject
3
int không dấu
Tương đương với PyObject
4. 1
PyObject
5
Dài
Tương đương với PyObject
6. 1
PyObject
7
không dấu dài
Tương đương với PyObject
8. 1
PyObject
9
PyTypeObject
0
Tương đương với PyTypeObject
1. 1
PyTypeObject
2
size_t
Tương đương với PyTypeObject
3. 1
PyTypeObject
4
int
Tương đương với PyTypeObject
5. 1
PyTypeObject
6
int
Tương đương với PyTypeObject
7. 1
PyTypeObject
8
const ký tự *
Một mảng ký tự C kết thúc null
PyTypeObject
9
const void*
Biểu diễn hex của con trỏ C. Hầu hết tương đương với bytes
0 ngoại trừ việc nó được đảm bảo bắt đầu bằng bytes
1 theo nghĩa đen bất kể sản lượng của bytes
2 của nền tảng là gì
Một ký tự định dạng không được nhận dạng khiến tất cả phần còn lại của chuỗi định dạng được sao chép nguyên trạng sang đối tượng kết quả và mọi đối số bổ sung bị loại bỏ
1[1,2,3,4,5,6,7,8]Đối với các chỉ định số nguyên [d, u, ld, lu, zd, zu, i, x]. cờ chuyển đổi 0 có hiệu lực ngay cả khi độ chính xác được cung cấp
PyObject *PyBytes_FromFormatV[const char *format, va_list vargs]¶Return value: New reference. Part of the ABI ổn định .
Giống hệt với bytes
3 ngoại trừ việc nó nhận đúng hai đối số
Return value: New reference. Part of the ABI ổn định .
Trả về biểu diễn byte của đối tượng o thực hiện giao thức bộ đệm
Py_ssize_t PyBytes_Size[PyObject *o]¶Part of the Stable ABI.
Trả về độ dài của byte trong đối tượng byte o
Py_ssize_t PyBytes_GET_SIZE[PyObject *o]¶Similar to bytes
4, but without error checking.
Part of the Stable ABI.
Trả về một con trỏ tới nội dung của o. Con trỏ đề cập đến bộ đệm bên trong của o, bao gồm bytes
5 byte. Byte cuối cùng trong bộ đệm luôn là null, bất kể có byte null nào khác hay không. Dữ liệu không được sửa đổi theo bất kỳ cách nào, trừ khi đối tượng vừa được tạo bằng cách sử dụng bytes
6. Nó không được thỏa thuận. Nếu o hoàn toàn không phải là đối tượng byte, thì bytes
7 trả về NULL
và tăng TypeError
Similar to bytes
7, but without error checking.
Part of the Stable ABI.
Trả về nội dung kết thúc null của đối tượng obj thông qua bộ đệm và độ dài biến đầu ra
Nếu độ dài là NULL
, thì đối tượng bytes có thể không chứa các byte rỗng được nhúng;
Bộ đệm đề cập đến bộ đệm bên trong của obj, bao gồm một byte rỗng bổ sung ở cuối [không được tính theo độ dài]. Dữ liệu không được sửa đổi theo bất kỳ cách nào, trừ khi đối tượng vừa được tạo bằng cách sử dụng bytes
6. Nó không được thỏa thuận. Nếu obj hoàn toàn không phải là đối tượng byte, thì NULL
5 trả về NULL
2 và tăng TypeError
Đã thay đổi trong phiên bản 3. 5. Trước đây, TypeError
đã được nâng lên khi bắt gặp các byte rỗng được nhúng trong đối tượng byte.
Part of the Stable ABI.
Tạo một đối tượng bytes mới trong *bytes chứa nội dung của phần mới được thêm vào bytes; . Tham chiếu đến giá trị cũ của byte sẽ bị đánh cắp. Nếu không thể tạo đối tượng mới, tham chiếu cũ đến byte sẽ vẫn bị loại bỏ và giá trị của *byte sẽ được đặt thành NULL
;
Part of the Stable ABI.
Tạo một đối tượng bytes mới trong *bytes chứa nội dung của phần mới được thêm vào bytes. Phiên bản này giảm số lượng tham chiếu của newpart
int _PyBytes_Resize[PyObject **bytes, Py_ssize_t newsize]¶A way to resize a bytes object even though it is “immutable”. Only use this to build up a brand new bytes object; don’t use this if the bytes may already be known in other parts of the code. It is an error to call this function if the refcount on the input bytes object is not one. Pass the address of an existing bytes object as an lvalue [it may be written into], and the new size desired. On success, *bytes holds the resized bytes object and NULL
0 is returned; the address in *bytes may differ from its input value. If the reallocation fails, the original bytes object at *bytes is deallocated, *bytes is set to NULL
, NULL
2 is set, and NULL
2 is returned.