Hướng dẫn how do you speed up a list in python? - làm thế nào để bạn tăng tốc một danh sách trong python?

Như đã đề cập trong các bình luận, nút cổ chai chính ở đây là việc sử dụng

big_list.add(word)
5.

Ngoài ra:

big_list.add(word)
6 chậm và không hoạt động:
big_list.add(word)
7 là một char, không và số nguyên. Sử dụng
big_list.add(word)
8 cho điều đó.

Tuyên bố

big_list.add(word)
9 là
with open('big_text_file.txt', 'r', encoding='UTF8') as f:
    big_list = sorted({line[:line.find('\t')].lower() for line in f if not line[0].isdigit() and '\t' in line})
0, bạn có thể thay thế:

if word not in big_list:
    big_list.append(word)

chỉ bằng

big_list.add(word)

.

Tốt hơn: Bạn có thể viết lại mã của mình (phần đầu tiên và thậm chí là phần sắp xếp) bằng cách sử dụng bộ hiểu được đặt trong một dòng:

with open('big_text_file.txt', 'r', encoding='UTF8') as f:
    big_list = sorted({line[:line.find('\t')].lower() for line in f if not line[0].isdigit() and '\t' in line})

Lưu ý cách tốt hơn để có được phần đầu tiên của dòng để tránh phân tách (và tạo danh sách mà bạn gần như không sử dụng)

Như đã nói ở trên, không cần kiểm tra

with open('big_text_file.txt', 'r', encoding='UTF8') as f:
    big_list = sorted({line[:line.find('\t')].lower() for line in f if not line[0].isdigit() and '\t' in line})
5 cho
with open('big_text_file.txt', 'r', encoding='UTF8') as f:
    big_list = sorted({line[:line.find('\t')].lower() for line in f if not line[0].isdigit() and '\t' in line})
2: Nếu từ đã có trong đó, nó sẽ không được chèn lại và kiểm tra quyết định chèn được thiết kế nhanh.

Lưu ý rằng việc đa xử lý có thể giúp ích, nhưng bạn sẽ nhấn nút I/O của đĩa và thuật toán sẽ phức tạp hơn vì bạn sẽ phải "chia" tệp lớn của mình bằng cách bỏ qua 8 phần bằng nhau của số dòng, tạo các bộ và giao với chúng ... Hãy gắn bó với phần đơn xử lý và xem nó diễn ra như thế nào.

Nguồn: Inverse.com

Danh sách Python là cấu trúc dữ liệu động đẹp. Chúng là cấu trúc dữ liệu lựa chọn cho rất nhiều thứ, vì vậy điều quan trọng nhất là có ý thức về tốc độ của mỗi hoạt động. Điều này thường được gọi là độ phức tạp của O hoặc thời gian lớn của giải pháp.

Danh sách sáng tạo

Có nhiều cách để tạo ra các mảng trong Python, vì vậy chúng ta hãy xem ít thời gian nhất. Đây là thiết lập chúng tôi đã sử dụng:

Danh sách toàn diện là phương pháp đầu tiên để tạo mảng. Chúng đơn giản và dễ đọc, điều đó làm cho chúng dễ viết như vậy.are the first method for creating arrays. They are simple and easy to read which makes them just as easy to write.

listComp = [i for i in range(0, end)]

Chất phụ lục là phương pháp tiếp theo. Tôi có xu hướng nhảy vào giải pháp này vì nó là một trong những điều dễ sử dụng hơn. Nó tương tự như cách bạn thêm vào danh sách trong hầu hết các ngôn ngữ khác.is the next method. I have a tendency to jump to this solution as it is one of the easier to use. It is similar to how you add to lists in most other languages.

append_list = []
for i in range(0,end):
append_list.append(i)

Is-allocating là phương pháp cuối cùng chúng tôi sẽ kiểm tra. Điều này chỉ hoạt động cho các mảng có chiều dài được xác định trước. Điều này liên quan đến việc tạo tất cả các đối tượng mảng trước và sau đó sửa đổi các giá trị của chúng theo chỉ mục. is the final method we will test. This only works for arrays with a predetermined length. This involves creating all of the array objects beforehand and then modifying their values by index.

preAllocate = [0] * end
for i in range(0, end):
preAllocate[i] = i

Kết quả: Trong khi các toàn bộ danh sách don don luôn có ý nghĩa nhất ở đây, họ là người chiến thắng rõ ràng. Tôi không đề nghị bạn cố gắng và gây nhiễu cho mọi vòng lặp vào sự hiểu biết. Trường hợp có ý nghĩa là khi bạn đang sử dụng đơn giản cho các vòng lặp hoặc tạo ra các mảng đặc biệt lớn.While list comprehensions don’t always make the most sense here they are the clear winner. I am not recommending you try and jam every for loop into a comprehension. Where it makes sense is when you are using simple for loops or creating especially large arrays.

Method:            Median Time:
listComprehension 0.5556 ms
preAllocate 1.1466 ms
append 1.3842 ms

So sánh danh sách

Bài kiểm tra cho điều này tương tự như ở trên. Chúng tôi đã tạo hai danh sách với 50.000 số ngẫu nhiên trong khoảng từ 0 đến 50.000. Sau đó chúng tôi so sánh hai danh sách để xem nếu

Double for Loop: Điều này nên có độ phức tạp về thời gian của O (N²). Đối với mỗi yếu tố, chúng ta sẽ phải lặp lại một phần hoặc tất cả danh sách thứ hai. This should have a time complexity of O(n²). For each element, we will have to iterate over part or all of the second list.

for i in list_a:
for j in list_b:
if i == j:
break

Trong tìm kiếm: Sự phức tạp về thời gian của ‘trong tình trạng khó hiểu. Biết rằng Double for Loop thực thi trong thời gian O (N²), sẽ có ý nghĩa đối với quyền truy cập ’trong hoạt động theo cách tương tự. Đây dường như không phải là trường hợp. Nó dường như hoạt động gần hơn với thời gian O (n log n). Nếu ai đó tình cờ quen thuộc với việc triển khai ’trong Cpython để lại nhận xét bên dưới và tôi sẽ bao gồm câu trả lời ở đây. The time complexity of ‘in’ is confusing. Knowing that the double for loop executes in O(n²) time, it would make sense for the ‘in’ access to operate in a similar manner. This does not seem to be the case. It seems to operate in closer to O(n log n) time. If someone happens to be familiar with the ‘in’ implementation in CPython leave a comment below and I will include the answer here.

for i in list_a:
if i in list_b:
continue

Đặt độ phức tạp thời gian tìm kiếm là một chút khác nhau. Việc thực hiện tập hợp trong Python về cơ bản là của bảng băm nên có quyền truy cập O (1). Do đó, bởi vì chúng tôi đang đi qua danh sách một lần và kiểm tra trong danh sách thứ hai là thao tác O (1) mà tìm kiếm đã đặt sẽ hoạt động trong thời gian O (n).time complexity is a little different. The implementation of set in Python is essentially that of a hash table so it has O(1) access. Therefore because we are going through the list one time and checking in the second list is an O(1) operation the set search should operate in O(n) time.

unique = set(list_b)
for i in list_a:
if i in unique:
continue

Kết quả: So sánh với các bộ là tuyệt vời. Đối với bất cứ ai tự hỏi, đôi cho vòng lặp là một điều tôi không bao giờ mong đợi làm tốt. Điều làm tôi ngạc nhiên là sử dụng ít thời gian hơn khi sử dụng toán tử ’trong người điều hành so với gấp đôi.Comparisons with sets are great. For anyone wondering, the double for loop was one I never expected to do well. What did surprise me was just how much less time using the ‘in’ operator took than the double for.

big_list.add(word)
0

Sắp xếp danh sách

Đối với phần cuối cùng của chúng tôi, chúng tôi sẽ nói về việc sắp xếp các danh sách trong Python. Có nhiều thuật toán sắp xếp phổ biến chúng tôi sẽ so sánh. Để xem một danh sách đầy đủ hơn các thuật toán sắp xếp, hãy xem Stackabuse để biết thêm.

Khi nói về việc phân loại, chúng ta cần nhớ rằng có các thuật toán sắp xếp ổn định và không ổn định. Một thuật toán ổn định nếu nó bảo tồn thứ tự ban đầu của các mục bằng nhau. Đây là một ví dụ về lý do tại sao sự ổn định có thể quan trọng:

Ví dụ ổn định

Giả sử chúng tôi có một lỗi trong mã của chúng tôi và chúng tôi muốn xem điều gì đã xảy ra. Chúng tôi có thể vào tệp nhật ký và sắp xếp các yêu cầu của người dùng. Đây là tệp nhật ký mẫu của chúng tôi:

big_list.add(word)
1

Trong một loại không ổn định, chúng tôi có thể kết thúc với một cái gì đó như thế này, trong đó các yêu cầu được người dùng sắp xếp, nhưng vì nó không ổn định, chúng tôi đã mất trình tự ban đầu của các sự kiện. Chúng tôi có thể không bao giờ tìm thấy lỗi của mình vì chúng tôi sẽ không thể thấy rằng User10 đã yêu cầu 2 tiếp cận máy chủ trước khi yêu cầu 1.

big_list.add(word)
2

Heapsort có độ phức tạp thời gian điển hình của O (n log n). Đây không phải là một thuật toán sắp xếp ổn định tuy nhiên vì vậy không có gì đảm bảo rằng các mặt hàng sẽ theo thứ tự ban đầu của chúng. Thuật toán này hoạt động bằng cách đặt các mục trên cây nhị phân trong đó nút gốc là giá trị tối đa. Sau đó, nó sẽ giải mã cây đó để tạo thành mảng được sắp xếp. has a typical time complexity of O(n log n). This is not a stable sorting algorithm however so there is no guarantee that items will be in their original order. This algorithm works by placing items on a binary tree where the root node is the maximum value. Then it will deconstruct that tree to form the sorted array.

Mergesort là một thuật toán phân chia và chinh phục có độ phức tạp thời gian điển hình của O (n log n). Thuật toán này phân tách danh sách làm đôi và một nửa đó làm đôi cho đến khi còn lại các yếu tố riêng lẻ. Sau đó, các yếu tố được ghép nối, sắp xếp và hợp nhất liên tục cho đến khi danh sách hoàn tất trở lại. Thuật toán này ổn định nên thật tuyệt vời khi cần thiết.is a divide and conquer algorithm that has a typical time complexity of O(n log n). This algorithm separates the list in half and those halves in half until there are individual elements left. Then the elements are paired up, sorted, and merged repeatedly until the list is complete again. This algorithm is stable so it is great where that is necessary.

Quicksort là một thuật toán được sử dụng rất phổ biến vì nó dễ thực hiện và có độ phức tạp thời gian trung bình của O (n log n). Vấn đề với điều này là mọi thứ đều dựa trên việc chọn một điểm xoay tốt đã ở đúng vị trí và sắp xếp xung quanh nó. Chọn một điểm trục kém có thể dẫn đến độ phức tạp thời gian O (n²). Điều này gắn liền với thực tế là nó không ổn định khiến tôi không đề xuất nó.is one very commonly used algorithm as it is easy to implement and has an average time complexity of O(n log n). The problem with this is everything is based around picking a good pivot point that is already in the proper place and sorting around it. Picking a poor pivot point could lead to an O(n²) time complexity. This tied with the fact that it is not stable leads me to not recommend it.

Timsort là một loại mà bạn có thể chưa từng nghe đến. Loại này, được đặt tên cho nhà phát minh Tim Peters, là sự kết hợp của một tìm kiếm nhị phân, sắp xếp chèn và một loại hợp nhất. Độ phức tạp thời gian trung bình của nó là O (n log n) tuy nhiên nó có thể đạt được điều này với tính nhất quán tốt hơn và có độ phức tạp trong trường hợp tốt nhất của O (n). Ngoài ra, đây là một thuật toán ổn định làm cho nó tuyệt vời khi sử dụng ở bất cứ đâu.is a sort that you may not have ever heard of. This sort, named for its inventor Tim Peters, is a combination of a binary search, insert sort, and a merge sort. Its average time complexity is O(n log n) however it is able to hit this with better consistency and has a best-case complexity of O(n). Also, this is a stable algorithm which makes it great to use anywhere.

Phần tốt nhất là sử dụng Timsort trong Python chỉ mất một dòng. Đúng rồi. Đó là chức năng sắp xếp tích hợp.

big_list.add(word)
3

Kết quả: Timsort vượt trội hơn tất cả các loại khác, đó là lý do tại sao nó là thuật toán sắp xếp cốt lõi cho Python. Tiếp theo Mergesort và Quicksort là cổ và cổ. Cuối cùng, Heapsort đang kéo lên phía sau tốt, phía sau của danh sách này ít nhất. Có rất nhiều thuật toán sắp xếp tồi tệ hơn như sắp xếp ngẫu nhiên.Timsort outperforms all the others which is why it is the core sorting algorithm for python. Next Mergesort and Quicksort are neck and neck. Finally, Heapsort is pulling up the rear… well, the rear of this list at least. There are plenty of worse sorting algorithms such as random sort.

big_list.add(word)
4

Dưới đây là một biểu đồ cho thấy O lớn của tất cả các thuật toán sắp xếp này. Ngoài ra, chúng tôi có độ phức tạp không gian, đó là bao nhiêu không gian cần thiết để hoàn thành thuật toán.

Đó là tất cả cho danh sách này. Bây giờ đi ra ngoài và sử dụng những thứ này trong Python hàng ngày của bạn và làm theo để biết thêm các mẹo và thủ thuật.

Làm thế nào để bạn làm cho một danh sách nhanh hơn trong Python?

Cách tốt nhất và/hoặc nhanh nhất để tạo danh sách trong Python..
Vòng lặp đơn giản có tính toán: my_list = [] cho i trong phạm vi (50): my_list.append (0).
Vòng lặp đơn giản với +=: my_list = [] cho i trong phạm vi (50): my_list += [0].
Danh sách hiểu: my_list = [0 cho i trong phạm vi (50)].

Python có thể được tăng tốc không?

So với làm việc với các ngôn ngữ như C và C ++, Python có thể cảm thấy quá chậm.May mắn thay, có một số thư viện tuyệt vời và các chức năng tích hợp có thể tăng tốc mã Python.there are some fantastic libraries and built-in functions that can speed up Python code.

Điều gì nhanh hơn một danh sách trong Python?

Danh sách có một bộ nhớ lớn.Tuple được lưu trữ trong một khối bộ nhớ duy nhất.Tạo một tuple nhanh hơn so với việc tạo một danh sách.Creating a tuple is faster than creating a list.

Làm cách nào để làm cho mã python của tôi chạy nhanh hơn 10 lần?

Kiểm tra danh sách các mẹo mã tốc độ Python và cũng đánh dấu bài viết này cho tương lai ...
Sử dụng danh sách hiểu.....
Sử dụng các chức năng thư viện.....
Sử dụng tham gia để kết hợp chuỗi.....
Sử dụng 1 cho bất kỳ vòng lặp vô cực.....
Nhiều nhiệm vụ.....
Sử dụng thư viện C.....
Cập nhật phiên bản Python của bạn.....
Cấu trúc dữ liệu thích hợp ..