Hướng dẫn is append or insert faster python? - Nối hay chèn python nhanh hơn?

Lưu ý rằng kết quả của bạn sẽ phụ thuộc vào việc thực hiện Python chính xác. CPYThon (và PYPY) tự động thay đổi kích thước danh sách của bạn và không gian cung cấp quá mức cho các lần nối trong tương lai và do đó tăng tốc độ ____1010 hơn nữa.

Trong nội bộ, các danh sách chỉ là những bộ nhớ có kích thước không đổi (trên đống). Đôi khi bạn may mắn và chỉ có thể tăng kích thước của khối, nhưng trong nhiều trường hợp, một đối tượng sẽ ở đó. Ví dụ: giả sử bạn đã phân bổ một khối kích thước 4 cho danh sách

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |
1 và một số mã khác được phân bổ một khối kích thước 6 cho một từ điển:

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d| | dictionary |

Giả sử danh sách của bạn có 4 yếu tố và một yếu tố khác được thêm vào. Bây giờ, bạn có thể chỉ cần thay đổi kích thước danh sách thành kích thước 5:

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |

Tuy nhiên, bạn sẽ làm gì nếu bạn cần một yếu tố khác bây giờ?

Chà, điều duy nhất bạn có thể làm là có được một không gian mới và sao chép nội dung của danh sách.

Memory 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
                | dictionary |a  b  c  d  e  f |

Lưu ý rằng nếu bạn có được không gian với số lượng lớn (cung cấp quá mức đã nói ở trên), bạn sẽ chỉ cần thay đổi kích thước (và có khả năng sao chép) danh sách mọi lúc.

Ngược lại, khi bạn chèn ở vị trí 0, bạn luôn cần sao chép danh sách của mình. Hãy chèn

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |
2:

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
orig   |a b c d| |dictionary|
after  |x a b c d|dictionary|

Mặc dù có đủ không gian để nối X ở cuối, chúng tôi phải di chuyển (thậm chí không sao chép, có thể ít tốn kém hơn trong bộ nhớ) tất cả các giá trị khác.

Mục tiêu¶

Bài đăng này nhằm so sánh hiệu suất giữa ____10 và

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |
4 trong Python. Việc so sánh hiệu suất chỉ đơn giản được thực hiện bởi đoạn mã đếm số, nối nó vào danh sách, và sau đó đảo ngược nó.

Chúng ta sẽ thấy sự khác biệt đáng kể giữa hai mã: một mã sử dụng

Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |
0 là tuyến tính và một mã khác sử dụng
Memory  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
       |a b c d e| dictionary |
4 là tăng trưởng thời gian chạy bậc hai như dưới đây.

Hướng dẫn is append or insert faster python? - Nối hay chèn python nhanh hơn?

Tài liệu tham khảo

  • Thuật toán Python: Làm chủ các thuật toán cơ bản trong ngôn ngữ Python

Thư viện;

In [26]:

from timeit import Timer
import pandas as pd
%matplotlib inline

Chắp chân

In [9]:

def count_by_append(count):
    nums = []
    for i in range(count):
        nums.append(i)
    nums.reverse()
count_by_append(count)

Thời gian thực hiện là 22ms

Chèn¶

In [10]:

def count_by_insert(count):
    nums = []
    for i in range(count):
        nums.insert(0, i)
count_by_insert(count)      

Thời gian thực hiện là 3,53S

So sánh ly

In [24]:

counts = [10 ** i for i in range(5)]
time_by_append = []
time_by_insert = []

for count in counts:
    print(f'Processing {count}')
    t = Timer(lambda: count_by_append(count))
    time_by_append.append(t.timeit(number=10))
    t = Timer(lambda: count_by_insert(count))
    time_by_insert.append(t.timeit(number=10))

df_performance = pd.DataFrame({'count': counts,
                               'count_by_append': time_by_append,
                               'count_by_insert': time_by_insert})
df_performance

Processing 1
Processing 10
Processing 100
Processing 1000
Processing 10000

Out[24]:

đếmcount_by_appendcount_by_insert
01 0.000013 0.000011
110 0.000019 0.000027
2100 0.000107 0.000227
31000 0.000927 0.005318
410000 0.009438 0.379457

In [34]:

# Plot the performance difference
df_performance.set_index('count').plot(title='Performance Comparison beteen Append and Insert');

Điều gì nhanh hơn so với phụ lục trong Python?

Vì vậy, khi bạn thêm các mặt hàng liên tục, bạn nên thích.append (), nếu không bạn nên sử dụng .extend ().. extend() .

Sự khác biệt giữa phương thức chèn () và append () trong Python là gì?

Sự khác biệt giữa hai phương pháp là.append () thêm một mục vào cuối danh sách, trong khi .Insert () chèn và mục ở một vị trí được chỉ định trong danh sách.append() adds an item to the end of a list, whereas . insert() inserts and item in a specified position in the list.

Có phải phụ lục trong Python chậm không?

Thỉnh thoảng, sẽ phải sao chép tất cả các yếu tố của một danh sách vào một danh sách lớn hơn,.Phụ lục phải chậm hơn so với việc phân bổ trước toàn bộ độ dài của danh sách và gán cho các chỉ số riêng lẻ của danh sách đó (tất nhiên bạn chỉ có thể làm điều đó nếu bạn biết bạn sẽ cần danh sách trước như thế nào).append must be slower than pre-allocating the entire length of the list and assigning to individual indices of that list (of course you can only do that if you know how big you will need the list to be beforehand).

Có phải thêm thêm nhanh hơn danh sách phụ lục?

Các bộ này nhanh hơn nhiều, nói chung.Kiểm tra tư cách thành viên trong danh sách là O (n), tuyến tính về kích thước của danh sách.Thêm vào một tập hợp là O (1), độc lập với số lượng các mục trong danh sách.. Testing for membership in a list is O(n), linear in the size of the list. Adding to a set is O(1), independent of the number of the items in the list.