Thay thế nhanh hơn cho vòng lặp Python

Python nổi tiếng là một ngôn ngữ lập trình chậm chạp. Mặc dù Python chậm hơn các ngôn ngữ khác, nhưng có nhiều chiến lược khác nhau để làm cho các chương trình Python của chúng ta chạy nhanh hơn

Làm sao?

Chúng tôi không chỉ hoàn thành công việc mà còn làm cho mã Python chạy nhanh hơn nếu chúng tôi viết mã sử dụng ít bộ nhớ và dung lượng lưu trữ hơn

Cách đây vài ngày, tôi đã phát hiện ra một cách tiếp cận nhanh và siêu nhanh để lặp trong Python

vòng lặp bình thường

Giả sử chúng ta muốn cộng các chữ số từ 1 đến 100000000. [chúng tôi có thể không bao giờ làm điều đó nhưng con số lớn đó sẽ giúp tôi đưa ra quan điểm của mình]

Tạo một biến tsum=0, lặp qua một phạm vi và tăng giá trị của tsum lên I trên mỗi lần lặp là một chiến lược phổ biến

Điều này thực hiện nhiệm vụ, nhưng phải mất 12. 45 giây

Mặc dù hiện tại nó không có vẻ chậm nhưng khi bạn thêm nhiều số 0 vào số bên trong phạm vi, nó sẽ chậm hơn

Hãy để mọi thứ di chuyển

Cách nhanh hơn trong Python cơ bản

Sử dụng các hàm tích hợp trong Python cung cấp cách tiếp cận vòng lặp nhanh hơn

Chúng ta có thể sử dụng hàm tổng thay vì vòng lặp for trong ví dụ của mình. Hàm này tính tổng các giá trị bên trong phạm vi số nguyên đã chỉ định

phải mất 2. 54 giây để chạy đoạn mã trên. Điều đó nhanh hơn rất nhiều so với vòng lặp cuối cùng. Đây là lý do tại sao chúng ta nên tránh sử dụng các vòng lặp và thay vào đó hãy sử dụng các hàm tích hợp sẵn

Tuy nhiên, vẫn còn tiềm năng phát triển

Nhanh ngu ngốc khi sử dụng Numpy

Tối ưu hóa mã của tôi là một trong những kỹ thuật công nghệ phần mềm mà tôi nên tuân theo để trở thành một lập trình viên giỏi hơn, tôi đã học được

Vòng lặp có thể được thực hiện hiệu quả hơn bằng cách vector hóa hoạt động. Đây là hệ số nhanh hơn một hoặc hai lần so với các lựa chọn thay thế Python thuần túy [đặc biệt là trong các phép tính số]

Chúng ta có thể sử dụng NumPy để đạt được vector hóa. Numpy là gói có cấu trúc dữ liệu hiệu quả để lưu trữ dữ liệu ma trận. Bởi vì nó chủ yếu được viết bằng C, bạn có thể đặt cược vào nó là nhanh

Chúng ta hãy xem các kỹ thuật Numpy. Thay vì sử dụng các hàm Python, bạn có thể sử dụng. tổng và. sắp xếp

Điều này hoàn thành nhiệm vụ trong 0. 703 giây. Điều này nhanh hơn nhiều so với các phương pháp trước đây

Đây là lý do tại sao, bất cứ khi nào khả thi, bạn nên chọn phép toán vectơ để lặp

Một số tra tấn nữa cho máy tính của tôi

Cho đến giờ, chúng ta đã thấy một chương trình Numpy đơn giản, nhưng nếu chúng ta cần làm nhiều hơn chỉ một vòng lặp for và một điều kiện if thì sao?

Numpy chắc chắn đánh bại các vòng lặp trong trường hợp này

Xem xét tình huống sau. chúng tôi có một tập hợp các kết quả bài kiểm tra ngẫu nhiên [từ 1 đến 100] và chúng tôi muốn tính điểm trung bình của những người trượt bài kiểm tra [điểm 70]

Với một vòng lặp for, đây là cách chúng tôi hoàn thành nó

Phải mất 38. 25 giây để làm nhiệm vụ này. Không tệ, tuy nhiên Numpy cho chúng tôi kết quả nhanh hơn

Đây là cách chúng tôi triển khai nó trong Numpy

Mất khoảng 1. 57 giây để chạy đoạn mã trên. Điều đó nhanh hơn rất nhiều và mã đơn giản

Thêm nội dung tại PlainEnglish. io. Đăng ký nhận bản tin hàng tuần miễn phí của chúng tôi. Theo dõi chúng tôi trên Twitter và LinkedIn. Tham gia cộng đồng của chúng tôi

Trong Python, chủ yếu có ba cách lặp qua một tập hợp các đối tượng. vòng lặp for-each, vòng lặp for-range và vòng lặp while. Mặc dù tất cả đều hoàn thành cùng một mục tiêu cơ bản, nhưng chúng hoạt động khác nhau dưới vỏ bọc. Do đó, hiệu suất của chúng có thể thay đổi đáng kể và gây ra tốc độ thực thi dưới mức tối ưu cho các chương trình của bạn

Trong bài viết này, trước tiên chúng ta sẽ so sánh ba cách lặp thông qua điểm chuẩn hiệu suất. Sau đó, chúng ta sẽ khám phá xem mỗi vòng lặp thực sự trông như thế nào đối với Máy ảo Python và thảo luận lý do tại sao một phương pháp này tốt hơn các phương pháp khác

Điểm chuẩn hiệu suất

Trước khi đi vào chi tiết hoạt động của các vòng lặp Python, trước tiên chúng tôi xác định phương pháp nào là nhanh nhất. Tập lệnh bên dưới so sánh tốc độ thực thi của ba hàm hoàn thành cùng một tác vụ, lặp qua một danh sách, theo một cách khác bằng cách sử dụng mô-đun timeit

Bạn có đoán được vòng lặp nào nhanh nhất và vòng lặp nào kém hiệu quả nhất không?

Foreach loop:       0.011 seconds
While loop: 0.076 seconds
For range loop: 0.042 seconds
The fastest method is Foreach loop with 0.011 seconds

Như bạn có thể thấy, vòng lặp for-each vượt trội so với các đối thủ cạnh tranh của nó với biên độ rộng. Ngoài ra, tốc độ thực hiện thay đổi đáng kể giữa thí sinh nhanh nhất và vòng lặp while lỏng lẻo hơn. vòng lặp for-each nhanh hơn sáu lần so với vòng lặp while. Ngay cả vòng lặp for-range cũng nhanh hơn gần hai lần so với vòng lặp while

Bây giờ, hãy dừng lại một chút và nghĩ xem bạn sử dụng vòng lặp nào nhiều nhất. Đã đến lúc thay đổi phong cách lập trình của bạn?

Cách Python nhìn thấy các vòng lặp

Như bạn có thể đã biết, mã nguồn Python trước tiên được biên dịch thành một mã byte Python cụ thể để được chạy bởi Máy ảo Python, một chương trình chuyển đổi mã byte bất khả tri về kiến ​​trúc này thành các lệnh máy để CPU thực thi. Để phân tích cách Python vòng lặp mã nguồn của bạn nhìn thấy mã của bạn, chúng ta có thể xem mã byte được tạo [bạn có bao giờ để ý đến các tệp .pyc đó không?]

Để làm cho cuộc sống của chúng tôi dễ dàng hơn, chúng tôi sẽ sử dụng Trình biên dịch Explorer, một công cụ trực tuyến tuyệt vời cho phép bạn dễ dàng phân tích mã nguồn đã biên dịch một cách thoải mái trên trình duyệt web của mình

Trước hết, chúng ta hãy xem vòng lặp while được dịch sang mã byte Python. Đừng lo lắng, tôi sẽ giải thích cẩn thận mọi thứ thông qua các bình luận khi cần thiết

Đây gần như là cách người ta mong đợi nó hoạt động, phải không? . Tôi sẽ đi nhanh hơn một chút ở đây, mặc dù

Tại đây, bạn có thể thấy rằng hàm range[] tích hợp và lệnh FOR_ITER được sử dụng thay vì tăng chỉ mục theo cách thủ công. Lợi thế về tốc độ nằm ở việc sử dụng các tính năng tích hợp sẵn vì chúng được triển khai bằng C [và do đó đã được biên dịch thành mã máy]. Để biết thêm thông tin, hãy xem CPython, trình thông dịch Python mặc định được viết bằng C

Cuối cùng, đây là mã byte được tạo cho vòng lặp for-each

Như bạn có thể thấy, ở đây chúng tôi gần như chỉ sử dụng các tính năng tích hợp sẵn, luôn nhanh hơn Python thuần túy. Đây là lý do tại sao vòng lặp for-each nhanh hơn rất nhiều so với các vòng lặp đối tác của nó vì tải nặng được xử lý bởi chính trình thông dịch Python theo cách tối ưu hóa

Hơn nữa, vòng lặp for-each cần ít hướng dẫn hơn về tổng thể, làm cho kích thước chương trình của bạn nhỏ hơn. Bạn sẽ khó nhận thấy bất kỳ sự khác biệt nào trong thế giới thực, nhưng đó vẫn là một lợi ích lý thuyết

Bây giờ, một số người có thể lập luận rằng không phải lúc nào bạn cũng cần hiệu suất cao nhất trong các ứng dụng của mình và việc sử dụng loại vòng lặp kém hiệu quả nhất không tạo ra nhiều sự khác biệt trong nhiều trường hợp sử dụng. Mặc dù điều này đôi khi đúng, chẳng hạn như khi thử nghiệm hoặc tạo mẫu, tốt hơn hết bạn nên viết mã được tối ưu hóa, đặc biệt nếu công việc duy nhất được yêu cầu là sử dụng các chức năng và tính năng tích hợp sẵn thay vì tự triển khai chúng bằng Python thuần túy

Ngoài ra, trước khi nghĩ đến việc thay đổi ngăn xếp công nghệ hoặc chi tiêu nhiều hơn cho các tài nguyên hệ thống như lõi CPU hoặc RAM, bạn nên kiểm tra phần mềm của mình để biết các khả năng tối ưu hóa như thế này

Nhưng tôi cũng cần chỉ mục cùng với phần tử

Nếu bạn cần cả phần tử và chỉ mục danh sách, bạn có thể nghĩ đến việc sử dụng loại vòng lặp for-range. Tuy nhiên, có hàm tích hợp sẵn của Python là enumerate[] thực hiện chính xác điều đó. Dưới đây là so sánh hiệu suất của hai phương pháp này

Và kết quả benchmark

For range loop:     0.043 seconds
For enumerate loop: 0.036 seconds
The fastest method is For enumerate loop with 0.036 seconds

Như bạn có thể thấy rõ ràng, các hàm dựng sẵn luôn có lợi thế hơn mã Python thuần túy. Trong trường hợp này, gánh nặng lập chỉ mục danh sách và lấy phần tử thứ i được trút bỏ khỏi vai mã của bạn và được xử lý bởi CPython

Đề phòng trường hợp bạn quan tâm, đây là mã byte đã nhận xét cho vòng lặp liệt kê, rất giống với vòng lặp for-each và for-range

Chìa khóa rút ra

Tóm lại, trong khi có nhiều cách lặp trong Python, cách tiếp cận rõ ràng tốt hơn là sử dụng vòng lặp for-each. Nói chung, bạn nên luôn ưu tiên các hàm và cấu trúc Python tích hợp vì chúng được tối ưu hóa hơn các phiên bản Python thuần túy, vì chúng được viết bằng C và đã được biên dịch thành mã máy

Bước đầu tiên để thành thạo là biết vũ khí của bạn, điểm mạnh và điểm yếu của chúng, để sử dụng chúng một cách tốt nhất

Tôi hy vọng bạn thích bài viết này. Nếu bạn có bất cứ điều gì để thêm, xin vui lòng chia sẻ suy nghĩ của bạn trong một bình luận. Cảm ơn vì đã đọc

Nếu bạn muốn tìm hiểu thêm về Trình biên dịch Explorer, tôi khuyên bạn nên xem câu chuyện này bên dưới

Tôi có thể sử dụng cái gì thay cho vòng lặp for trong Python?

Hàm map[] là sự thay thế cho vòng lặp for. Nó áp dụng một chức năng cho từng phần tử của một lần lặp. Hàm map[] chấp nhận hai đối số. Một hàm được áp dụng cho từng phần tử trong danh sách [một biểu thức lambda]

Cái nào nhanh hơn vòng lặp for?

Hiểu danh sách nhanh hơn vòng lặp for để tạo danh sách. Tuy nhiên, điều này là do chúng tôi đang tạo danh sách bằng cách thêm các phần tử mới vào danh sách đó ở mỗi lần lặp lại.

Vòng lặp nào nhanh hơn vòng lặp for?

vòng lặp while là vòng lặp nhanh nhất.

Tôi có thể sử dụng cái gì thay cho vòng lặp for?

Chúng tôi có nhiều hàm bậc cao hơn có thể được sử dụng thay cho vòng lặp for như 'reduce', 'map', 'filter', 'foreach', 'find'< . , etc.

Chủ Đề