Hướng dẫn what is faster than a list in python? - cái gì nhanh hơn một danh sách trong python?

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

Những gì nhanh hơn một danh sách?

Tuple và Set nhanh hơn danh sách vì: Tuple: Immutable, có nghĩa là nó chỉ có 2 phương thức [đếm và chỉ mục]. Bất biến làm cho nó trở thành bộ nhanh nhất: có thể thay đổi, không nhanh bằng tuple, nó không cho phép trùng lặp và không có phương pháp chỉ mục. Ngày 17 tháng 5 năm 2020, 6:10 sáng. Pacurar Sebastian. are faster than lists because: tuple: immutable, which means it has only 2 methods[count and index]. immutability makes it the fastest set: mutable, not as fast as tuple, it doesn't allow duplicates and has no index method. 17th May 2020, 6:10 AM. Sebastian Pacurar.

Tại sao [] nhanh hơn danh sách []?

Như được hiển thị trong kết quả, sử dụng [] nhanh hơn khoảng 3 lần so với List [].Nó rất tự tin vì kết quả dựa trên 10.000.000 lần chạy.Bạn cũng có thể thú vị trong một số kịch bản tương tự khác như {} và dict [].the results are based on 10,000,000 runs. You might also interesting in some other similar scenarios such as {} and dict[] .

Cái nào nhanh hơn trong danh sách Python hoặc mảng?

Một mảng nhanh hơn một danh sách trong Python vì tất cả các yếu tố được lưu trữ trong một mảng là đồng nhất, tức là, chúng có cùng loại dữ liệu trong khi một danh sách chứa các yếu tố không đồng nhất.Hơn nữa, các mảng Python được triển khai trong C, giúp nó nhanh hơn rất nhiều so với các danh sách được tích hợp trong chính Python. since all the elements stored in an array are homogeneous i.e., they have the same data type whereas a list contains heterogeneous elements. Moreover, Python arrays are implemented in C which makes it a lot faster than lists that are built-in in Python itself.

Loại dữ liệu nào nhanh hơn trong Python?

Các bộ dữ liệu python thường nhanh hơn kiểu dữ liệu danh sách trong Python vì nó không thể thay đổi hoặc sửa đổi như kiểu dữ liệu danh sách. Tuples are generally faster than the list data type in Python because it cannot be changed or modified like list datatype.

Bài Viết Liên Quan

Chủ Đề