Hướng dẫn how fast is a python for loop - Python for loop nhanh như thế nào

Bạn có nghĩ Python chậm không? Đây là một cách nhanh chóng để lặp trong Python

Hình ảnh qua Shutterstock theo giấy phép cho Frank Andrade

Python được biết đến là ngôn ngữ lập trình chậm. Mặc dù nó là một thực tế là Python chậm hơn các ngôn ngữ khác, nhưng có một số cách để tăng tốc mã Python của chúng tôi.

Làm sao? Đơn giản, tối ưu hóa mã của bạn.

Nếu chúng ta viết mã tiêu thụ ít bộ nhớ và lưu trữ, không chỉ chúng ta sẽ hoàn thành công việc mà còn làm cho mã Python của chúng ta chạy nhanh hơn.

Ở đây, một cách nhanh chóng và cũng là một cách siêu nhanh để lặp trong Python mà tôi đã học được trong một trong những khóa học Python tôi đã tham gia (chúng tôi không bao giờ ngừng học!).

Vòng lặp trung bình

Giả sử chúng tôi muốn tổng số các 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).

Một cách tiếp cận điển hình sẽ là tạo một biến total_sum=0, lặp qua một phạm vi và tăng giá trị của total_sum bằng i trên mỗi lần lặp.

Điều này được thực hiện công việc, nhưng phải mất khoảng 6,58 giây.seconds.

Mặc dù bây giờ trông không quá chậm, nhưng nó sẽ chậm hơn khi bạn thêm nhiều 0 vào số bên trong phạm vi.

Hãy để tăng tốc độ này!

Một cách nhanh hơn để lặp bằng cách sử dụng các chức năng tích hợp

Một cách nhanh hơn để lặp trong Python là sử dụng các chức năng tích hợp.

Trong ví dụ của chúng tôi, chúng tôi có thể thay thế vòng lặp cho chức năng sum. Hàm này sẽ tổng hợp các giá trị bên trong phạm vi số.

Mã trên mất 0,84 giây. Đó là cách nhanh hơn so với vòng lặp trước chúng tôi đã sử dụng! Đây là lý do tại sao chúng ta nên chọn các chức năng tích hợp trên các vòng lặp.

Nhưng vẫn còn chỗ để cải thiện.

Một cách siêu nhanh để sử dụng Numpy

Một vài tuần trước, trong một khóa học khoa học dữ liệu tôi đã tham gia, tôi đã học được rằng một trong những thực tiễn kỹ thuật phần mềm mà tôi nên làm theo để trở thành một nhà khoa học dữ liệu tốt hơn đang tối ưu hóa mã của tôi.

Chúng ta có thể tối ưu hóa các vòng lặp bằng cách vận hành vector hóa. Đây là một/hai bậc có độ lớn nhanh hơn so với tương đương Python thuần túy của chúng (đặc biệt là trong các tính toán số).

Vectorization là một cái gì đó chúng ta có thể nhận được với Numpy. Numpy là một thư viện với các cấu trúc dữ liệu hiệu quả được thiết kế để giữ dữ liệu ma trận. Nó được viết chủ yếu bằng C, vì vậy tốc độ là thứ bạn có thể tin tưởng.

Hãy thử sử dụng các phương thức Numpy .sum.arange thay vì các hàm Python.

Điều này nhận được công việc được thực hiện trong 0,22 giây. Đây là cách nhanh hơn các phương pháp trước đây.

Đây là lý do tại sao bạn nên sử dụng các hoạt động vector qua các vòng lặp bất cứ khi nào có thể.

Đặt vòng lặp và numpy vào thử nghiệm với nhiều tính toán hơn

Cho đến nay, chúng tôi đã thấy một ứng dụng đơn giản của Numpy, nhưng nếu chúng ta không chỉ có một vòng lặp, mà là một điều kiện nếu điều kiện và nhiều tính toán hơn để làm?

Ở đây, khi Numpy rõ ràng vượt trội hơn các vòng lặp.

Hãy tưởng tượng chúng tôi có một loạt các điểm thi ngẫu nhiên (từ 1 đến 100) và chúng tôi muốn có được điểm trung bình của những người thất bại trong kỳ thi (điểm số

Ở đây, cách thức chúng tôi làm điều này với một vòng lặp.

Mất khoảng 15,7 giây. Không tệ, nhưng chúng ta có thể nhận được kết quả nhanh hơn với Numpy.

Ở đây, cách thức chúng tôi làm điều này với Numpy.

Mã trên mất khoảng 0,78 giây. Đó là cách nhanh hơn và mã là đơn giản!

Phân tích sâu Python for-Arech, for-Range, và trong khi các vòng lặp để tìm ra cái tốt nhất

Ảnh của Jonathan Chng trên unplash

Trong Python, chủ yếu có ba cách lặp lại trên một bộ sưu tập các đối tượng: vòng lặp for-exch, vòng lặp cho tầm và trong khi vòng lặp. 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 mui xe. Bởi vì điều này, hiệu suất của họ có thể thay đổi đáng kể và gây ra tốc độ thực hiện 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 tôi sẽ so sánh ba cách lặp qua điểm chuẩn hiệu suất. Sau đó, chúng tôi sẽ khám phá những gì mỗi vòng lặp thực sự trông giống như máy ảo Python và thảo luận về lý do tại sao một phương pháp 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 các chi tiết làm việc của các vòng 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 nhiệm vụ, lặp qua danh sách, theo một cách khác bằng mô -đun timeit:

Bạn có thể đoán được vòng lặp nào là nhanh nhất và cái nào là hiệu quả nhất? Khi bạn đã sẵn sàng, hãy xem kết quả điểm chuẩn từ đầu ra bảng điều khiển:

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-Elect vượt trội so với các đối thủ cạnh tranh của mình bằng một biên độ rộng. Ngoài ra, tốc độ thực thi thay đổi đáng kể giữa thí sinh nhanh nhất và vòng lỏng hơn trong khi vòng lặp: các vòng lặp lại nhanh hơn sáu lần so với các vòng lặp. 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 trong khi.

Bây giờ, hãy dừng lại một lúc và suy nghĩ về vòng lặp bạn sử dụng nhiều nhất. Đã đến lúc thay đổi phong cách lập trình của bạn? Dù sao, cho dù bạn đã sử dụng phương pháp hiệu quả nhất hay bất kỳ phương pháp kém nào khác, đã đến lúc khám phá lý do tại sao vòng lặp For-Elect rất nhanh so với các đối tác của nó.

Làm thế nào Python nhìn thấy các vòng lặp

Như bạn có thể đã biết, mã nguồn Python lần đầu tiên được biên dịch cho 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 không liên quan đến kiến ​​trúc này thành hướng dẫn máy cho 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ờ nhận thấy 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 Compiler 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 được biên dịch từ sự thoải mái của trình duyệt web của bạn.

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

Đây là khá nhiều cách người ta mong đợi nó hoạt động, phải không? Bây giờ, hãy xem xét kỹ hơn về vòng lặp cho tầm thường. Tôi sẽ đi nhanh hơn một chút ở đây, mặc dù.

Ở đây bạn có thể thấy rằng hàm

For range loop:     0.043 seconds
For enumerate loop: 0.036 seconds
The fastest method is For enumerate loop with 0.036 seconds
0 tích hợp và hướng dẫn
For range loop:     0.043 seconds
For enumerate loop: 0.036 seconds
The fastest method is For enumerate loop with 0.036 seconds
1 được sử dụng thay vì tăng thủ công chỉ mục. Lợi thế tốc độ nằm ở việc sử dụng các tính năng tích hợp vì chúng được triển khai trong C (và do đó đã được biên dịch cho 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-Arech:

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

Hơn nữa, vòng lặp For-Elect cần ít hướng dẫn hơn, 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 bạn không cần phải có hiệu suất cao nhất trong các ứng dụng của mình và sử dụng loại vòng lặp hiệu quả nhất không tạo ra nhiều sự khác biệt cho nhiều trường hợp sử dụng. Mặc dù điều này đôi khi là đúng, ví dụ như khi kiểm tra hoặc tạo mẫu, nhưng nó luôn luôn tốt hơn để viết mã được tối ưu hóa, đặc biệt là 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 thay vì tự thực hiện chúng trong Python thuần túy.

Ngoài ra, trước khi suy nghĩ về việc thay đổi ngăn xếp công nghệ của bạn 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 tối ưu hóa tiềm năng 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ĩ về việc sử dụng loại vòng lặp for-Range. Tuy nhiên, có chức năng tích hợp Python

For range loop:     0.043 seconds
For enumerate loop: 0.036 seconds
The fastest method is For enumerate loop with 0.036 seconds
2 thực hiện chính xác điều đó. Ở đây, so sánh hiệu suất của hai phương pháp sau:

Và kết quả điểm chuẩn:

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õ, các chức năng tích hợp luôn có lợi thế so với mã Python thuần túy. Trong trường hợp này, gánh nặng của việc lập chỉ mục danh sách và nhận phần tử ITH được lấy ra khỏi vai mã của bạn và được xử lý bởi Cpython.

Chỉ trong trường hợp bạn quan tâm, đây là mã byte được nhận xét cho vòng lặp ermative, rất giống với các vòng lặp for-Arech và for-Range:

Key Takeaways

Để kết thúc nó, 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-exch. Nói chung, bạn phải luôn thích 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 của chúng, vì chúng được viết bằng C và đã được biên dịch cho mã máy.

Bước đầu tiên hướng tới việc làm chủ là biết vũ khí của bạn, những điểm yếu và điểm yếu của họ, để sử dụng chúng ở mức tốt nhất của bạn.

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 quan tâm đến việc tìm hiểu thêm về trình duyệt trình duyệt, tôi khuyên bạn nên xem câu chuyện này dưới đây:

Python cho vòng lặp nhanh như thế nào?

Một cách nhanh hơn để lặp trong Python là sử dụng các chức năng tích hợp.Trong ví dụ của chúng tôi, chúng tôi có thể thay thế vòng lặp cho chức năng tổng.Hàm này sẽ tổng hợp các giá trị bên trong phạm vi số.Mã trên mất 0,84 giây.0.84 seconds.

Là cho vòng lặp nhanh hơn trong khi Python?

Ngoài ra, tốc độ thực thi thay đổi đáng kể giữa thí sinh nhanh nhất và vòng lỏng hơn trong khi vòng lặp: các vòng lặp lại nhanh hơn sáu lần so với các vòng lặp.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 trong khi.for-each loops are more than six times faster than while loops. Even the for-range loop is nearly two times faster than the while loop.

Vòng lặp nào nhanh nhất?

Vòng lặp là nhanh nhất nhưng có thể đọc được kém.Các foreach là nhanh, và lặp lại có thể kiểm soát được.Các trò chơi dành cho thời gian, nhưng nó ngọt ngào hơn.Những người cho trong thời gian, do đó ít thuận tiện hơn.for loop is the fastest but poorly readable. The foreach is fast, and iteration is controllable. The for…of takes time, but it's sweeter. The for…in takes time, hence less convenient.

Là cho vòng lặp nhanh hơn trong khi?

Lý do chính mà trong khi chậm hơn nhiều là vì vòng lặp trong khi kiểm tra điều kiện sau mỗi lần lặp, vì vậy nếu bạn định viết mã này, chỉ cần sử dụng một vòng lặp cho LOOP thay thế.While is much slower is because the while loop checks the condition after each iteration, so if you are going to write this code, just use a for loop instead.