Tóm tắt điều hành
Tuples có xu hướng hoạt động tốt hơn danh sách trong hầu hết mọi danh mục:
1] Bộ dữ liệu có thể được gấp không đổi.
2] Bộ dữ liệu có thể được tái sử dụng thay vì sao chép.
3] Bộ dữ liệu nhỏ gọn và không phân bổ quá mức.
4] Tuples trực tiếp tham chiếu các yếu tố của chúng.
Tuples có thể được gấp không đổi
Các bộ đếm các hằng số có thể được tính toán trước bởi bộ tối ưu hóa PEEPHOLE của Python hoặc AST-tối ưu hóa. Danh sách, mặt khác, được xây dựng từ đầu:
>>> from dis import dis
>>> dis[compile["[10, 'abc']", '', 'eval']]
1 0 LOAD_CONST 2 [[10, 'abc']]
3 RETURN_VALUE
>>> dis[compile["[10, 'abc']", '', 'eval']]
1 0 LOAD_CONST 0 [10]
3 LOAD_CONST 1 ['abc']
6 BUILD_LIST 2
9 RETURN_VALUE
Tuples không cần phải sao chép
Chạy tuple[some_tuple]
trả lại ngay lập tức. Vì các bộ dữ liệu là bất biến, chúng không phải sao chép:
>>> a = [10, 20, 30]
>>> b = tuple[a]
>>> a is b
True
Ngược lại, list[some_list]
yêu cầu tất cả dữ liệu được sao chép vào danh sách mới:
>>> a = [10, 20, 30]
>>> b = list[a]
>>> a is b
False
Bộ dữ liệu không được phân bổ quá mức
Vì kích thước của một tuple được cố định, nó có thể được lưu trữ nhỏ gọn hơn so với các danh sách cần phân bổ quá mức để thực hiện các hoạt động EPPEND [] hiệu quả.
Điều này mang lại cho Tuples một lợi thế không gian đẹp:
>>> import sys
>>> sys.getsizeof[tuple[iter[range[10]]]]
128
>>> sys.getsizeof[list[iter[range[10]]]]
200
Dưới đây là nhận xét từ các đối tượng/listObject.c giải thích những danh sách đang làm gì:
/* This over-allocates proportional to the list size, making room
* for additional growth. The over-allocation is mild, but is
* enough to give linear-time amortized behavior over a long
* sequence of appends[] in the presence of a poorly-performing
* system realloc[].
* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
* Note: new_allocated won't overflow because the largest possible value
* is PY_SSIZE_T_MAX * [9 / 8] + 6 which always fits in a size_t.
*/
Tuples đề cập trực tiếp đến các yếu tố của chúng
Các tham chiếu đến các đối tượng được kết hợp trực tiếp trong một đối tượng tuple. Ngược lại, các danh sách có thêm một lớp không liên tục cho một loạt các con trỏ bên ngoài.
Điều này mang lại cho Tuples một lợi thế tốc độ nhỏ để tra cứu và giải nén: giải nén:
$ python3.6 -m timeit -s 'a = [10, 20, 30]' 'a[1]'
10000000 loops, best of 3: 0.0304 usec per loop
$ python3.6 -m timeit -s 'a = [10, 20, 30]' 'a[1]'
10000000 loops, best of 3: 0.0309 usec per loop
$ python3.6 -m timeit -s 'a = [10, 20, 30]' 'x, y, z = a'
10000000 loops, best of 3: 0.0249 usec per loop
$ python3.6 -m timeit -s 'a = [10, 20, 30]' 'x, y, z = a'
10000000 loops, best of 3: 0.0251 usec per loop
Đây là cách lưu trữ Tuple
>>> a = [10, 20, 30]
>>> b = tuple[a]
>>> a is b
True
0: typedef struct {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size;
PyObject *ob_item[2]; /* store a pointer to 10 and a pointer to 20 */
} PyTupleObject;
Dưới đây là cách lưu trữ danh sách
>>> a = [10, 20, 30]
>>> b = tuple[a]
>>> a is b
True
1: PyObject arr[2]; /* store a pointer to 10 and a pointer to 20 */
typedef struct {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size;
PyObject **ob_item = arr; /* store a pointer to the two-pointer array */
Py_ssize_t allocated;
} PyListObject;
Lưu ý rằng đối tượng tuple kết hợp trực tiếp hai con trỏ dữ liệu trong khi đối tượng danh sách có một lớp Interection bổ sung vào một mảng bên ngoài giữ hai con trỏ dữ liệu.
Trong Python, chúng ta có hai loại đối tượng. 1. có thể thay đổi, 2. bất biến. Trong danh sách Python ** xuất hiện dưới các đối tượng có thể thay đổi và ** Tuples xuất hiện dưới các đối tượng bất biến.lists **comes under mutable objects and **tuples comes under immutable objects.
- Bộ dữ liệu được lưu trữ trong một khối bộ nhớ duy nhất. Tuples là bất biến vì vậy, nó không cần thêm không gian để lưu trữ các đối tượng mới. are stored in a single block of memory. Tuples are immutable so, It doesn't require extra space to store new objects.
- Danh sách được phân bổ trong hai khối: một khối cố định với tất cả thông tin đối tượng Python và một khối có kích thước biến cho dữ liệu. are allocated in two blocks: the fixed one with all the Python object information and a variable sized block for the data.
- Đó là lý do tạo ra một tuple nhanh hơn danh sách.tuple is faster than List.
- Nó cũng giải thích sự khác biệt nhỏ về tốc độ lập chỉ mục nhanh hơn danh sách, bởi vì trong các bộ đếm để lập chỉ mục, nó tuân theo ít con trỏ hơn.
Ưu điểm sử dụng Tuples: ¶
- Tuples là họ sử dụng ít bộ nhớ hơn trong đó danh sách sử dụng nhiều bộ nhớ hơn
- Chúng ta có thể sử dụng các bộ dữ
- Chúng ta có thể truy cập phần tử với một chỉ mục trong cả hai bộ dữ liệu và danh sách
Nhược điểm của Tuples¶
- Chúng ta không thể thêm một phần tử vào tuple nhưng chúng ta có thể thêm phần tử vào danh sách.
- Chúng ta không thể sắp xếp một tuple nhưng trong một danh sách, chúng ta có thể sắp xếp bằng cách gọi phương thức "list.sort []".
- Chúng ta không thể xóa một phần tử trong tuple nhưng trong danh sách chúng ta có thể xóa phần tử
- Chúng tôi không thể thay thế một phần tử trong tuple nhưng bạn có thể trong danh sách
Reference:
//docs.python.org/2/library/functions.html#tuple