Kích thước biến python tính bằng byte

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

type PyBytesObject

Loại con này của PyObject đại diện cho một đối tượng byte Python

PyTypeObject PyBytes_Type
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;

int PyBytes_Check[PyObject *o]

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.

PyObject *PyBytes_FromString[const char *v]
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;

PyObject *PyBytes_FromStringAndSize[const char *v, Py_ssize_t len]
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

PyObject *PyBytes_FromFormat[const char *format, ...]
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:  136
0 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:  136
1

không có

Ký tự % theo nghĩa đen

PyObject0

int

Một byte đơn, được biểu thị dưới dạng C int

PyObject1

int

Tương đương với PyObject2. 1

PyObject3

int không dấu

Tương đương với PyObject4. 1

PyObject5

Dài

Tương đương với PyObject6. 1

PyObject7

không dấu dài

Tương đương với PyObject8. 1

PyObject9

PyTypeObject0

Tương đương với PyTypeObject1. 1

PyTypeObject2

size_t

Tương đương với PyTypeObject3. 1

PyTypeObject4

int

Tương đương với PyTypeObject5. 1

PyTypeObject6

int

Tương đương với PyTypeObject7. 1

PyTypeObject8

const ký tự *

Một mảng ký tự C kết thúc null

PyTypeObject9

const void*

Biểu diễn hex của con trỏ C. Hầu hết tương đương với bytes0 ngoại trừ việc nó được đảm bảo bắt đầu bằng bytes1 theo nghĩa đen bất kể sản lượng của bytes2 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 bytes3 ngoại trừ việc nó nhận đúng hai đối số

PyObject *PyBytes_FromObject[PyObject *o]
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 bytes4, but without error checking.

char *PyBytes_AsString[PyObject *o]
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 bytes5 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 bytes6. 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ì bytes7 trả về NULL và tăng TypeError

char *PyBytes_AS_STRING[PyObject *string]

Similar to bytes7, but without error checking.

int PyBytes_AsStringAndSize[PyObject *obj, char **buffer, Py_ssize_t *length]
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 bytes6. 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ì NULL5 trả về NULL2 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.

void PyBytes_Concat[PyObject **bytes, PyObject *newpart]
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;

void PyBytes_ConcatAndDel[PyObject **bytes, PyObject *newpart]
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 NULL0 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, NULL2 is set, and NULL2 is returned.

Có bao nhiêu byte là một biến trong Python?

Thông thường, tám byte được sử dụng cho kiểu động Python.

Kích thước của biến trong Python là gì?

Tên biến chính thức trong Python có thể độ dài bất kỳ và có thể bao gồm chữ hoa và chữ thường [ A-Z , a-z ], chữ số [ 0 .

__ sizeof __ trong Python là gì?

Phương thức __sizeof__[] của Python trả về kích thước của đối tượng theo byte . hệ thống. phương thức getsizeof[] gọi nội bộ __sizeof__[] và thêm một số chi phí byte bổ sung, e. g. , để thu gom rác.

Có bao nhiêu byte là một chuỗi Python?

Lưu ý rằng mỗi chuỗi trong Python cần thêm 49-80 byte bộ nhớ, nơi chuỗi lưu trữ thông tin bổ sung, chẳng hạn như hàm băm, độ dài, . Đó là lý do tại sao một chuỗi trống chiếm 49 byte bộ nhớ.

Chủ Đề