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.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]:
1 | 0.000013 | 0.000011 |
10 | 0.000019 | 0.000027 |
100 | 0.000107 | 0.000227 |
1000 | 0.000927 | 0.005318 |
10000 | 0.009438 | 0.379457 |
In [34]:
# Plot the performance difference df_performance.set_index['count'].plot[title='Performance Comparison beteen Append and Insert'];