Đã bao giờ bạn tự hỏi tại sao một thứ đơn giản như vòng lặp For lại là quá đủ để giải quyết một vấn đề, nhưng chúng tôi bắt gặp một cách tiếp cận hoàn toàn khác và một đoạn mã phức tạp để triển khai nó. Điều này xảy ra với tôi mọi lúc và điều đó khiến tôi nghĩ tại sao một lập trình viên phải trải qua thời gian dài như vậy để thực hiện nó
Tất nhiên, mỗi lập trình viên có một cách tiếp cận logic khác nhau đối với một vấn đề và có rất nhiều suy nghĩ và cân nhắc trong quá trình triển khai, điều này gây tò mò hơn và đôi khi thách thức để hiểu lý do logic đằng sau những triển khai đó
Ảnh của Tine Ivanič trên Bapt
Như đã nói, trong bài viết này, chúng ta sẽ khám phá một trường hợp sử dụng đơn giản và sẽ thực hiện các cách tiếp cận triển khai khác nhau cho cùng một vấn đề và hy vọng các lập trình viên sẽ suy luận ra cơ sở hợp lý trong việc triển khai một cách tiếp cận thay thế.
“Hầu hết hiệu quả của các vòng lặp quyết định hiệu quả của ứng dụng”
Xem xét ví dụ dưới đây chứa danh sách ứng dụng và tình trạng sức khỏe tương ứng của chúng. Chúng tôi phải phân tích cú pháp dữ liệu và nếu bất kỳ ứng dụng nào có trạng thái lỗi [Trạng thái không bằng 200] thì sẽ kích hoạt bản dựng cho hành động lỗi
app_health = [
{
"app_name": "tintin",
"status": 200
},
{
"app_name": "tintin_services",
"status": 400
},
{
"app_name": "tintin_db",
"status": 400
}
]
Cách tiếp cận “vòng lặp For” đơn giản
Hãy triển khai bằng cách sử dụng vòng lặp for để lặp qua phần tử của danh sách và kiểm tra trạng thái của từng ứng dụng để tìm lỗi [Trạng thái không bằng 200 hoặc 201]. Khi chúng ta quan tâm đến câu lệnh break xảy ra lỗi đầu tiên được sử dụng để thoát khỏi vòng lặp for
for items in app_health:
if items.get["status"] not in [200, 201]:
""" Trigger action for application failure"""
print["{}.Application is down".format[items.get["app_name"]]]
break
Giải pháp hoạt động hoàn toàn tốt, vì nó lặp lại qua từng phần tử và xác định lần đầu tiên xảy ra lỗi ứng dụng và kích hoạt hành động thích hợp cho lỗi ứng dụng, Trong trường hợp này, chúng tôi đang in tên của ứng dụng bị lỗi. Đầu ra của mã trên và việc sử dụng bộ nhớ được hiển thị bên dưới
tintin_services.Application is down
-----------------------
| Memory Usage |13.9MB|
-----------------------
Phương pháp hiểu danh sáchCác giải pháp trên chỉ hoạt động tốt, Vì chúng tôi đang thực hiện việc này trong Python, nên cần có cách triển khai Pythonic. Danh sách hiểu đó là. Theo cách tiếp cận này, chúng tôi sẽ lặp lại từng phần tử trong danh sách “app_health” và trả về danh sách lỗi ứng dụng
print[["{}.Application is down".format[items.get["app_name"]]
for items in app_health if items.get["status"] not in [200, 201]]]
Các kết quả đầu ra của đoạn mã trên được trình bày dưới đây. Cách tiếp cận này thay vì trả về lần xuất hiện đầu tiên, nó đã trả về tất cả các lần xuất hiện lỗi và chúng tôi có thể kích hoạt lỗi ứng dụng trong trường hợp danh sách trả về có giá trị [độ dài của danh sách lớn hơn 0]
Mặc dù không có bất kỳ sự khác biệt đáng chú ý nào trong việc sử dụng bộ nhớ, sự suy giảm hiệu suất rất có thể xảy ra trên quy mô lớn
Phương pháp tiếp cận trình vòng lặp['tintin_services.Application is down', 'tintin_db.Application is down']
------------------------
| Memory Usage |13.86MB|
------------------------
Python - Tiếp theo []Hãy tinh chỉnh các giải pháp toàn diện trong danh sách trên để chỉ trả về lần xuất hiện lỗi đầu tiên. Làm thế nào để đạt được điều này?
print[next["{}.Application is down".format[items.get["app_name"]]
for items in app_health if items.get["status"] not in [200, 201]]]
đánh giá lười biếng hoặc gọi theo nhu cầu là một chiến lược đánh giá trì hoãn việc đánh giá một biểu thức cho đến khi cần giá trị của nó [đánh giá không nghiêm ngặt] và cũng tránh đánh giá lặp lại. Việc chia sẻ có thể giảm thời gian chạy của một số chức năng nhất định theo hệ số mũ so với các chiến lược đánh giá không nghiêm ngặt khác — With Love Wiki
Vì vậy, bằng cách triển khai hàm next[] lặp qua danh sách, “app_health” sẽ lặp cho đến khi tìm thấy lần xuất hiện đầu tiên và lợi thế lớn nhất là các vòng lặp sẽ không thực thi cho đến khi hàm next[] được gọi lại. [lười đánh giá]
Đầu ra và mức sử dụng bộ nhớ của đoạn mã trên được trình bày bên dưới. Chúng ta sẽ có thể thấy sự cải thiện đáng kể về hiệu suất với sự gia tăng kích thước của đầu vào
tintin_services.Application is down
-----------------------
| Memory Usage |13.89MB|
-----------------------
Tóm tắtVẻ ngoài có thể đánh lừa đôi khi những thứ tưởng chừng đơn giản lại không hề đơn giản như vậy. Luôn tìm kiếm một phương pháp thay thế có thể hoạt động tốt hơn trên quy mô lớn - Hy vọng chúng ta có một số lý do tại sao lập trình viên thích các tùy chọn khác hơn là một phương pháp tiêu chuẩn. Xét cho cùng, lập trình viên chúng ta không điên như vẻ ngoài của nó [Một lần nữa vẻ ngoài có thể đánh lừa]
Rất ít phương pháp thay thế để xem xét, có thể được sử dụng thay cho việc triển khai các vòng lặp cổ điển
- hàm bậc cao. [Đó là một chủ đề cho một ngày khác] — Hàm bậc cao hơn lấy một hoặc nhiều hàm làm đối số và trả về một hàm
print[list[filter[lambda x: x.get["status"] not in [200, 201], app_health]]]
- Các hàm đệ quy— Một hàm gọi chính nó có tính chất đệ quy. Điều này chúng ta có thể sử dụng khi một vấn đề phức tạp có thể được giải quyết bằng cách lặp lại một vấn đề nhỏ hơn, nhưng hãy lưu ý đến sự phức tạp về thời gian
- Trình tạo & Trình lặp — Trình tạo là hàm trả về một trình vòng lặp, thay vì đánh giá thực tế của câu lệnh
Chúc bạn đọc vui vẻ…Cho đến lần sau
Một ghi chú từ tiếng Anh thuần túyBạn có biết rằng chúng tôi đã ra mắt một kênh YouTube không? . Hãy xem chúng tôi bằng cách nhấp vào đây và nhớ đăng ký kênh nhé 😎