Python int thành byte

Khoa học và tính toán dựa trên dữ liệu hiệu quả đòi hỏi phải hiểu cách dữ liệu được lưu trữ và thao tác. Phần này phác thảo và đối chiếu cách các mảng dữ liệu được xử lý bằng chính ngôn ngữ Python và cách NumPy cải thiện điều này. Hiểu được sự khác biệt này là nền tảng để hiểu phần lớn nội dung xuyên suốt phần còn lại của cuốn sách.

Người dùng Python thường bị thu hút bởi tính dễ sử dụng của nó, một phần trong số đó là tính năng gõ động. Trong khi một ngôn ngữ kiểu tĩnh như C hoặc Java yêu cầu mỗi biến phải được khai báo rõ ràng thì một ngôn ngữ kiểu động như Python lại bỏ qua đặc tả này. Ví dụ: trong C, bạn có thể chỉ định một thao tác cụ thể như sau

/* C code */
int result = 0;
for(int i=0; i<100; i++){
    result += i;
}

Trong khi trong Python, hoạt động tương đương có thể được viết theo cách này

# Python code
result = 0
for i in range(100):
    result += i

Lưu ý sự khác biệt chính. trong C, các kiểu dữ liệu của từng biến được khai báo rõ ràng, trong khi ở Python, các kiểu được suy ra động. Điều này có nghĩa là, ví dụ, chúng ta có thể gán bất kỳ loại dữ liệu nào cho bất kỳ biến nào

# Python code
x = 4
x = "four"

Ở đây chúng ta đã chuyển nội dung của

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
8 từ một số nguyên sang một chuỗi. Điều tương tự trong C sẽ dẫn đến (tùy thuộc vào cài đặt trình biên dịch) đến lỗi biên dịch hoặc các hậu quả không mong muốn khác

/* C code */
int x = 4;
x = "four";  // FAILS

Loại linh hoạt này là một phần giúp Python và các ngôn ngữ được nhập động khác trở nên thuận tiện và dễ sử dụng. Hiểu cách thức hoạt động của nó là một phần quan trọng của việc học để phân tích dữ liệu hiệu quả và hiệu quả với Python. Nhưng điều mà tính linh hoạt của kiểu này cũng chỉ ra là thực tế là các biến Python không chỉ có giá trị của chúng; . Chúng ta sẽ khám phá điều này nhiều hơn trong các phần tiếp theo

Một số nguyên trong Python không chỉ là một số nguyên

Việc triển khai Python tiêu chuẩn được viết bằng C. Điều này có nghĩa là mọi đối tượng Python chỉ đơn giản là một cấu trúc C được ngụy trang khéo léo, không chỉ chứa giá trị của nó mà còn chứa các thông tin khác. Ví dụ: khi chúng ta định nghĩa một số nguyên trong Python, chẳng hạn như

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
9, thì
struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
8 không chỉ là số nguyên "thô". Nó thực sự là một con trỏ tới cấu trúc C phức hợp, chứa một số giá trị. Nhìn qua Python 3. 4, chúng tôi thấy rằng định nghĩa kiểu số nguyên (dài) trông giống như thế này (khi các macro C được mở rộng)

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};

Một số nguyên duy nhất trong Python 3. 4 thực sự chứa bốn mảnh

  • L = list(range(10))
    L
    
    1, một số tham chiếu giúp Python âm thầm xử lý việc cấp phát và giải phóng bộ nhớ
  • L = list(range(10))
    L
    
    2, mã hóa loại biến
  • L = list(range(10))
    L
    
    3, chỉ định kích thước của các thành viên dữ liệu sau
  • L = list(range(10))
    L
    
    4, chứa giá trị số nguyên thực tế mà chúng tôi muốn biến Python đại diện

Điều này có nghĩa là có một số chi phí trong việc lưu trữ một số nguyên trong Python so với một số nguyên trong ngôn ngữ được biên dịch như C, như được minh họa trong hình dưới đây

Python int thành byte

Đây

L = list(range(10))
L
5 là một phần của cấu trúc chứa số lượng tham chiếu, mã loại và các phần khác được đề cập trước đó

Lưu ý sự khác biệt ở đây. số nguyên C về cơ bản là nhãn cho một vị trí trong bộ nhớ có byte mã hóa giá trị số nguyên. Số nguyên Python là một con trỏ tới một vị trí trong bộ nhớ chứa tất cả thông tin đối tượng Python, bao gồm các byte chứa giá trị số nguyên. Thông tin bổ sung này trong cấu trúc số nguyên Python là thứ cho phép Python được mã hóa một cách tự do và linh hoạt. Tuy nhiên, tất cả thông tin bổ sung này trong các loại Python đều phải trả giá, điều này trở nên đặc biệt rõ ràng trong các cấu trúc kết hợp nhiều đối tượng này

Danh sách Python không chỉ là một danh sách

Bây giờ hãy xem xét điều gì sẽ xảy ra khi chúng ta sử dụng cấu trúc dữ liệu Python chứa nhiều đối tượng Python. Vùng chứa đa phần tử có thể thay đổi tiêu chuẩn trong Python là danh sách. Chúng ta có thể tạo một danh sách các số nguyên như sau

Trong 1]

________số 8_______

Ra[1]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Trong 2]

type(L[0])

Ra[2]

int

Hoặc, tương tự, một danh sách các chuỗi

Trong 3]

L2 = [str(c) for c in L]
L2

Ra[3]

# Python code
result = 0
for i in range(100):
    result += i
0

Trong [4]

# Python code
result = 0
for i in range(100):
    result += i
1

Ra[4]

# Python code
result = 0
for i in range(100):
    result += i
2

Do kiểu gõ động của Python, chúng ta thậm chí có thể tạo các danh sách không đồng nhất

Trong [5]

# Python code
result = 0
for i in range(100):
    result += i
3

Ra[5]

# Python code
result = 0
for i in range(100):
    result += i
4

Nhưng sự linh hoạt này phải trả giá. để cho phép các loại linh hoạt này, mỗi mục trong danh sách phải chứa thông tin loại, số lượng tham chiếu và thông tin khác của riêng nó–nghĩa là mỗi mục là một đối tượng Python hoàn chỉnh. Trong trường hợp đặc biệt tất cả các biến đều cùng loại, phần lớn thông tin này là dư thừa. lưu trữ dữ liệu trong một mảng kiểu cố định có thể hiệu quả hơn nhiều. Sự khác biệt giữa danh sách kiểu động và mảng kiểu cố định (kiểu NumPy) được minh họa trong hình dưới đây

Python int thành byte

Ở cấp độ triển khai, mảng về cơ bản chứa một con trỏ tới một khối dữ liệu liền kề. Mặt khác, danh sách Python chứa một con trỏ tới một khối con trỏ, mỗi con trỏ lần lượt trỏ tới một đối tượng Python đầy đủ giống như số nguyên Python mà chúng ta đã thấy trước đó. Một lần nữa, lợi thế của danh sách là tính linh hoạt. bởi vì mỗi phần tử danh sách là một cấu trúc đầy đủ chứa cả dữ liệu và thông tin loại, danh sách có thể chứa đầy dữ liệu thuộc bất kỳ loại mong muốn nào. Các mảng kiểu NumPy loại cố định thiếu tính linh hoạt này, nhưng hiệu quả hơn nhiều để lưu trữ và thao tác dữ liệu

Mảng kiểu cố định trong Python

Python cung cấp một số tùy chọn khác nhau để lưu trữ dữ liệu trong bộ đệm dữ liệu loại cố định, hiệu quả. Mô-đun

L = list(range(10))
L
6 tích hợp sẵn (có sẵn từ Python 3. 3) có thể được sử dụng để tạo các mảng dày đặc thuộc loại đồng nhất

Trong [6]

# Python code
result = 0
for i in range(100):
    result += i
5

Ra[6]

# Python code
result = 0
for i in range(100):
    result += i
6

Ở đây

L = list(range(10))
L
7 là mã loại cho biết nội dung là số nguyên

Tuy nhiên, hữu ích hơn nhiều là đối tượng

L = list(range(10))
L
8 của gói NumPy. Trong khi đối tượng
L = list(range(10))
L
6 của Python cung cấp khả năng lưu trữ hiệu quả dữ liệu dựa trên mảng, thì NumPy bổ sung thêm các hoạt động hiệu quả này trên dữ liệu đó. Chúng ta sẽ khám phá các hoạt động này trong các phần sau;

Chúng tôi sẽ bắt đầu với việc nhập NumPy tiêu chuẩn, dưới bí danh

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0

Trong [7]

# Python code
result = 0
for i in range(100):
    result += i
7

Tạo mảng từ danh sách Python

Đầu tiên, chúng ta có thể sử dụng

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1 để tạo mảng từ danh sách Python

Trong [8]

# Python code
result = 0
for i in range(100):
    result += i
8

Ra[8]

# Python code
result = 0
for i in range(100):
    result += i
9

Hãy nhớ rằng không giống như danh sách Python, NumPy bị hạn chế đối với các mảng chứa cùng loại. Nếu các loại không khớp, NumPy sẽ upcast nếu có thể (ở đây, các số nguyên được up lên thành dấu phẩy động)

Trong [9]

# Python code
x = 4
x = "four"
0

Ra[9]

# Python code
x = 4
x = "four"
1

Nếu chúng ta muốn thiết lập rõ ràng kiểu dữ liệu của mảng kết quả, chúng ta có thể sử dụng từ khóa

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2

Trong [10]

# Python code
x = 4
x = "four"
2

Ra[10]

# Python code
x = 4
x = "four"
3

Cuối cùng, không giống như danh sách Python, mảng NumPy rõ ràng có thể là đa chiều;

Trong [11]

# Python code
x = 4
x = "four"
4

Ra[11]

# Python code
x = 4
x = "four"
5

Các danh sách bên trong được coi là các hàng của mảng hai chiều kết quả

Tạo mảng từ đầu

Đặc biệt đối với các mảng lớn hơn, việc tạo các mảng từ đầu sẽ hiệu quả hơn bằng cách sử dụng các quy trình được tích hợp trong NumPy. Dưới đây là một số ví dụ

Trong [12]

# Python code
x = 4
x = "four"
6

Ra[12]

# Python code
x = 4
x = "four"
7

Trong [13]

# Python code
x = 4
x = "four"
8

Ra[13]

# Python code
x = 4
x = "four"
9

Trong [14]

/* C code */
int x = 4;
x = "four";  // FAILS
0

Ra[14]

/* C code */
int x = 4;
x = "four";  // FAILS
1

Trong [15]

/* C code */
int x = 4;
x = "four";  // FAILS
2

Ra[15]

/* C code */
int x = 4;
x = "four";  // FAILS
3

Trong [16]

/* C code */
int x = 4;
x = "four";  // FAILS
4

Ra[16]

/* C code */
int x = 4;
x = "four";  // FAILS
5

Trong [17]

/* C code */
int x = 4;
x = "four";  // FAILS
6

Ra[17]

/* C code */
int x = 4;
x = "four";  // FAILS
7

Trong [18]

/* C code */
int x = 4;
x = "four";  // FAILS
8

Hết[18]

/* C code */
int x = 4;
x = "four";  // FAILS
9

Trong 19]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
0

Hết[19]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
1

Trong 20]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
2

Hết[20]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
3

Trong [21]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
4

Hết[21]

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
5

Kiểu dữ liệu chuẩn NumPy

Mảng NumPy chứa các giá trị của một loại duy nhất, vì vậy điều quan trọng là phải có kiến ​​thức chi tiết về các loại đó và các hạn chế của chúng. Vì NumPy được xây dựng bằng C nên các loại này sẽ quen thuộc với người dùng C, Fortran và các ngôn ngữ liên quan khác

Các kiểu dữ liệu NumPy tiêu chuẩn được liệt kê trong bảng sau. Lưu ý rằng khi xây dựng một mảng, chúng có thể được chỉ định bằng một chuỗi

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
6

Hoặc sử dụng đối tượng NumPy được liên kết

struct _longobject {
    long ob_refcnt;
    PyTypeObject *ob_type;
    size_t ob_size;
    long ob_digit[1];
};
7

Kiểu dữ liệuMô tả

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3Boolean (True hoặc False) được lưu trữ dưới dạng byte
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4Kiểu số nguyên mặc định (giống như C
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5; thông thường là
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6 hoặc
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8Giống với C
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9 (thường là
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7 hoặc
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6)
type(L[0])
2Số nguyên được sử dụng để lập chỉ mục (giống như C
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
47; thông thường hoặc là
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6) .
int
6Nửa phao chính xác. bit dấu, 5 bit số mũ, 10 bit định trị
int
7 Phao chính xác đơn. bit dấu, 8 bit số mũ, 23 bit phần định trị
int
5 Phao chính xác kép. bit dấu, 11 bit số mũ, 52 bit phần định trị
int
9Viết tắt của
L2 = [str(c) for c in L]
L2
0.
L2 = [str(c) for c in L]
L2
1Số phức, được biểu thị bằng hai số float 32 bit
L2 = [str(c) for c in L]
L2
0Số phức, được biểu thị bằng hai số float 64 bit

Có thể có đặc tả loại nâng cao hơn, chẳng hạn như chỉ định số cuối lớn hoặc nhỏ; . NumPy cũng hỗ trợ các loại dữ liệu phức hợp, sẽ được đề cập trong Dữ liệu có cấu trúc. Mảng có cấu trúc của NumPy

Có bao nhiêu byte là một int Python?

Để an toàn, Python phân bổ một số byte cố định không gian trong bộ nhớ cho mỗi biến thuộc loại số nguyên thông thường, được gọi là int trong Python. Thông thường, một số nguyên chiếm bốn byte hoặc 32 bit.

Có bao nhiêu byte là một int?

Các kiểu int và unsigned int có kích thước bốn byte .

int16 trong Python là gì?

int16. Một số nguyên có dấu 16 bit có các giá trị tồn tại trong khoảng [−32,767, +32,767] .

Bạn có thể chuyển đổi một byte thành một int không?

Một đối tượng byte có thể được chuyển đổi thành giá trị số nguyên một cách dễ dàng bằng Python . Python cung cấp cho chúng ta nhiều phương thức dựng sẵn khác nhau như from_bytes() cũng như các lớp để thực hiện chuyển đổi xen kẽ này.