Cách nhanh nhất để thêm vào danh sách python

Các trường hợp cạnh dưới đây tốt hơn trong một số trường hợp, nhưng

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
5 nói chung là lựa chọn tốt nhất. Tất cả các tùy chọn được đề cập đều hoạt động trong Python 2. 3, Trăn 2. 7 và tất cả các phiên bản Python 31

Kết hợp các danh sách tại chỗ trong Python

Vấn đề. Bạn có một danh sách lớn và bạn muốn thêm một danh sách nhỏ hơn vào cuối trong khi giảm thiểu việc sử dụng bộ nhớ

Trong trường hợp này, tốt nhất bạn nên thêm vào danh sách hiện có, sử dụng lại danh sách đó thay vì tạo lại danh sách mới

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]

Như với bất kỳ tối ưu hóa nào, bạn nên xác minh rằng điều này làm giảm sự cố bộ nhớ trong trường hợp cụ thể của bạn và tuân theo thành ngữ đơn giản

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 nếu không thì

Hãy sử dụng mô-đun

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
9 để kiểm tra một số con số hiệu suất

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804

Trong ví dụ này, trong đó x là 3000 phần tử, phần mở rộng nhanh hơn khoảng 50 lần

❗ Nối các danh sách với các phần tử lớn là tốt

Nếu các phần tử trong danh sách của bạn rất lớn [hàng triệu chuỗi ký tự], nhưng kích thước danh sách nhỏ hơn một nghìn phần tử, thì giải pháp trước đó

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 sẽ hoạt động tốt. Điều này là do Python lưu trữ các tham chiếu đến các giá trị trong danh sách chứ không phải chính các giá trị đó. Do đó, kích thước phần tử không tạo ra sự khác biệt đối với độ phức tạp thời gian chạy

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365

Trong trường hợp này,

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 không có lợi thế

Tránh chuỗi từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 cho hai danh sách

Có thể sử dụng

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 để tạo một danh sách có thể lặp lại gồm hai danh sách

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Chúng tôi có thể kiểm tra hiệu suất của việc sử dụng chuỗi

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Sử dụng

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 với hai danh sách sẽ chậm hơn trong mọi trường hợp được kiểm tra và
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8 dễ hiểu hơn

Kết hợp N Danh sách trong Python

Nếu bạn cần thêm ba hoặc thậm chí mười danh sách lại với nhau và các danh sách này được biết tĩnh, thì

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
5 để ghép nối hoạt động rất tốt

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
6

Làm phẳng một danh sách các danh sách trong Python

Tuy nhiên, nếu số lượng danh sách là động và không xác định cho đến thời gian chạy, thì

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 từ
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
2 trở thành một lựa chọn tuyệt vời. Chuỗi lấy một danh sách các danh sách và làm phẳng nó thành một danh sách duy nhất

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
9

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
3 có thể lấy bất kỳ thứ gì có thể lặp lại, làm cho nó trở thành một lựa chọn tuyệt vời để kết hợp danh sách, từ điển và các cấu trúc có thể lặp lại khác

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Hiệu suất làm phẳng một danh sách các danh sách

Hiệu suất không phải lúc nào cũng quan trọng, nhưng khả năng đọc luôn quan trọng và phương pháp chuỗi là một cách đơn giản để kết hợp danh sách các danh sách. Điều đó nói rằng, hãy tạm gác khả năng đọc sang một bên và cố gắng tìm cách nhanh nhất để làm phẳng danh sách

Một lựa chọn là lặp đi lặp lại chính chúng ta

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Hãy kiểm tra hiệu suất của nó so với chuỗi

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
0

Điều này cho thấy rằng

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
1 nhanh hơn mở rộng

Làm phẳng và hợp nhất danh sách với một danh sách lớn

Điều gì về việc thêm một danh sách các danh sách vào một danh sách lớn hiện có?

Đầu tiên, chúng tôi sử dụng tiêu chuẩn của chúng tôi

>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
1

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
1

Sau đó chúng tôi kiểm tra hiệu suất của nó

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
2

Tiếp theo, hãy thử nối bằng cách thêm mọi thứ vào danh sách dài

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
3

Kiểm tra hiệu suất

>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
4

Vậy là xong,

# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 nhanh hơn nhiều khi làm phẳng danh sách hoặc nối nhiều danh sách với một danh sách dài. Nếu bạn gặp phải vấn đề này, việc sử dụng
# Performance Check
>>> setup = """\
x = ["one","two","three"] * 1000 
y = ["four","five","six"]
"""
# x + y with large x
>>> timeit.timeit['x + y', setup=setup, number=1000000]
3.6260274310000113
# x.extend[y] with large x
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06857255800002804
1 để thêm các danh sách nhỏ hơn vào danh sách dài có thể làm giảm công việc phải hoàn thành và tăng hiệu suất

Bản tóm tắt

Đây là những biến thể chính của việc kết hợp danh sách trong python. Sử dụng bảng này để hướng dẫn bạn trong tương lai

Ngoài ra, nếu bạn đang tìm kiếm một cách hay để chuẩn hóa các quy trình xung quanh dự án python của mình – chạy thử nghiệm, cài đặt phần phụ thuộc và mã linting – hãy xem Earthly for Repeatable Builds

Điều kiệnGiải phápTối ưu hóa hiệu suất22 danh sách
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
8Không có 1 danh sách lớn, 1 danh sách nhỏ
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
7CóSố danh sách N đã biết
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
8KhôngSố danh sáchN không xác định
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
9Không có danh sách các danh sách
>>> x = ["one" * 1000, "two" * 1000, "three" * 1000]
>>> y = ["four" * 1000, "five" * 1000]
>>> #This is fine
>>> z = x + y
>>> #Performance Testing [extend is slower for large elements]
>>>  setup = """\
x = ["one" * 1000, "two" * 1000, "three" * 1000]
y = ["four" * 1000, "five" * 1000]
"""
>>> timeit.timeit['x + y', setup=setup, number=1000000]
0.05397573999994165
>>> timeit.timeit['x.extend[y]', setup=setup, number=1000000]
0.06511967799997365
9Không có 1 danh sách lớn, nhiều danh sách nhỏ
>>>longlist = ["one","two", "three"] * 1000
['one', 'two', 'three', 'one', 'two', 'three', .. ]
>>>shortlist = ["four","five"]
["four","five"]
>>> x.extend[y]
>>> x
['one', 'two', 'three', 'one',  ..., "four","five"]
11Có
  1. Tôi đã thực hiện tất cả các bài kiểm tra hiệu năng bằng Python 3. 9. 5 trên MacOS BigSur. ↩︎

  2. Nếu bạn không có nút thắt cổ chai về hiệu suất, hiệu suất rõ ràng sẽ vượt trội và bạn nên bỏ qua các đề xuất về hiệu suất

    Cái gì nhanh hơn nối thêm Python?

    Vì vậy, khi bạn thêm các mục liên tục, bạn nên ưu tiên. append[] , nếu không thì bạn nên sử dụng . mở rộng[] .

    Phương pháp nào nhanh hơn trong danh sách nối thêm hoặc chèn?

    Nối thêm vào cuối danh sách, trong khi chèn thêm vào trước một chỉ mục đã chỉ định. Chèn chậm hơn khi so sánh với chắp thêm .

    Tôi có thể sử dụng += để thêm vào danh sách trong Python không?

    Đối với danh sách, += giống phương thức mở rộng hơn là phương thức chắp thêm . Với một danh sách ở bên trái toán tử +=, cần một danh sách khác ở bên phải toán tử. Tất cả các mục trong danh sách ở bên phải của toán tử được thêm vào cuối danh sách được tham chiếu ở bên trái của toán tử.

    Việc thêm vào một tập hợp có nhanh hơn danh sách Python không?

    Nói chung, danh sách nhanh hơn tập hợp . Nhưng trong trường hợp tìm kiếm một phần tử trong tập hợp, các tập hợp sẽ nhanh hơn vì các tập hợp đã được triển khai bằng cách sử dụng bảng băm. Vì vậy, về cơ bản Python không phải tìm kiếm toàn bộ, điều đó có nghĩa là độ phức tạp thời gian trung bình là O[1].

Chủ Đề